[ruby] “nil or zero”를위한 ​​최고의 루비 관용구

값이 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합니다 .nilnonzero?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

물론 영리하지는 않지만 (매우) 명확합니다.