[ruby] 루비에서 변수가 nil이 아니고 0이 아닌지 확인

변수가 0이 아닌 0이 아닌지 확인하기 위해 다음 코드를 사용하고 있습니다.

if(discount != nil && discount != 0)
  ...
end

더 좋은 방법이 있습니까?



답변

discount.nil이 아니라면? || 할인 == 0
  # ...
종료


답변

class Object
  def nil_zero?
    self.nil? || self == 0
  end
end

# which lets you do
nil.nil_zero? # returns true
0.nil_zero?   # returns true
1.nil_zero?   # returns false
"a".nil_zero? # returns false

unless discount.nil_zero?
  # do stuff...
end

일반적인 면책 조항에주의하십시오 : 강력한 힘 / 책임, 어두운면으로 이어지는 원숭이 패치 등.


답변

5 년이 지난 후 ….

if discount.try :nonzero?
  ...
end

이 노트에 중요 try그것이 일반 루비에서 사용할 수 없습니다 있도록 ActiveSupport 보석에 정의되어 있습니다.


답변

[nil, 0] .include? (할인)이 아닌 한
  # ...
종료


답변

Ruby 2.3.0부터 안전한 탐색 연산자 ( &.) 와을 결합 할 수 있습니다 Numeric#nonzero?. 인스턴스가 있었고 -숫자 인 경우를 &.반환 nil합니다 .nilnonzero?0

if discount&.nonzero?
  # ...
end

또는 접미사 :

do_something if discount&.nonzero?


답변

if (discount||0) != 0
  #...
end


답변

당신은 이것을 할 수 있습니다 :

if (!discount.nil? && !discount.zero?)

경우 때문에 순서는 여기에 중요 discount하다 nil, 다음은 없을 것이다 zero?방법을. 그러나 Ruby의 단락 평가는 discount.zero?if discount가 평가를 시도하지 못하게해야합니다 nil.