값이 nil인지 0인지 확인하는 간결한 방법을 찾고 있습니다. 현재 나는 다음과 같은 일을하고있다.
if (!val || val == 0)
# Is nil or zero
end
그러나 이것은 매우 서투른 것 같습니다.
답변
객체에 nil이 있습니까? 방법 .
if val.nil? || val == 0
[do something]
end
또는 단 하나의 지침에 대해 :
[do something] if val.nil? || val == 0
답변
끝에 물음표가있는 메서드 이름을 정말 좋아한다면 :
if val.nil? || val.zero?
# do stuff
end
귀하의 솔루션은 다른 몇 가지 솔루션과 마찬가지로 괜찮습니다.
루비는 조심하지 않으면 모든 것을 할 수있는 예쁜 방법을 찾게 만들 수 있습니다.
답변
Ruby 2.3.0부터는 안전한 탐색 연산자 ( &.
)를 Numeric#nonzero?
. 인스턴스가 다음 과 같고-숫자가 다음 과 같으면 &.
반환 nil
합니다 .nil
nonzero?
0
unless val&.nonzero?
# Is nil or zero
end
또는 접미사 :
do_something unless val&.nonzero?
답변
먼저 그 특정 상태를 확인할 수있는 가장 간결한 방법이라고 생각합니다.
둘째, 이것은 디자인의 잠재적 인 결함을 나타내는 코드 냄새입니다. 일반적으로 nil과 0은 같은 것을 의미해서는 안됩니다. 가능하다면 메서드의 시작 부분이나 다른 메커니즘을 확인하여이 코드를 누르기 전에 val이 nil 일 가능성을 제거해야합니다.
이 경우 코드가 좋다고 생각하는 완벽하게 합법적 인 이유가있을 수 있지만 적어도 가능하면 nil 검사를 제거하는 것을 고려할 것입니다.
답변
Object.nil을 사용할 수 있습니까? 구체적으로 nil을 테스트하기 위해 (그리고 false와 nil 사이에 걸리지 않습니다). 메서드를 Object에 몽키 패치 할 수도 있습니다.
class Object
def nil_or_zero?
return (self.nil? or self == 0)
end
end
my_object = MyClass.new
my_object.nil_or_zero?
==> false
Object에 대한 변경 사항은 동료가 추적하기 어렵고 다른 사람이 코드를 예측할 수 없게 만들 수 있으므로 권장되지 않습니다.
답변
nil.to_i는 0을 반환하므로 자주 이렇게합니다.
val.to_i.zero?
그러나 val이 #to_i에 응답하지 않는 객체이면 예외가 발생합니다.
답변
귀하의 코드가 잘못되었다고 생각합니다. : 그것은 사실 시험에서 세 가지 값에 대한 것 nil
, false
및 0. 이는 !val
루비에서 nil
및 인 거짓 인 모든 값에 대해 표현식이 참 이기 때문 false
입니다.
내가 지금 생각 해낼 수있는 최선의 방법은
if val == nil || val == 0
# do stuff
end
물론 영리하지는 않지만 (매우) 명확합니다.
