检查变量是否为零并且在ruby中不为零

hec*_*rsq 249 ruby

我使用以下代码来检查变量是否为零而不是零

if(discount != nil && discount != 0) 
  ...
end
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

Dej*_*mic 404

unless discount.nil? || discount == 0
  # ...
end

  • @ orion-edwards为什么? (93认同)
  • 目前的"Ruby样式指南"代表`和和或关键字被禁止.这不值得.始终使用&&和|| instead.`.这是正确的,因为大卫和汤姆的原因. (62认同)
  • 使用'或'很危险.'或'的运算符优先级低于'=',因此以下内容具有意外行为:a = false或true #a在此语句后为false (38认同)
  • 使用'或'代替|| (31认同)
  • @xiy目前指南建议假装或者和不存在(||是那个还是&&和?) (20认同)
  • 使用||,符号比单词更容易阅读.任何试图阅读单词问题的人都能理解这些痛苦 - 只有在你用数学公式编写时才有意义. (5认同)
  • @yxi但是根据那些准则,不是||。在这种情况下的首选? (2认同)
  • 多么古怪的编程语言! (2认同)

mad*_*lep 40

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
Run Code Online (Sandbox Code Playgroud)

谨防通常的免责声明......强大的权力/责任,猴子补丁导致黑暗面等.


Dej*_*mic 27

unless [nil, 0].include?(discount) 
  # ...
end

  • 美丽?是.可读?并不是的. (12认同)
  • 我发现这完全可读,我更喜欢它而不是新课程。做得好。 (2认同)

rew*_*ten 25

好的,5年过去了....

if discount.try :nonzero?
  ...
end
Run Code Online (Sandbox Code Playgroud)

重要的是要注意,它try是在ActiveSupport gem中定义的,因此它在普通的ruby中不可用.

  • 请注意,这是**特定于**轨道的答案.香草红宝石没有"尝试"方法. (7认同)
  • 答案现在重复/sf/answers/2437387291/ ...我认为将其保留为“try”以显示替代选项是有价值的(这就是为什么它首先被投票的原因!) ,只要读者清楚“ActiveSupport”不是普通的 ruby​​。 (2认同)

ndn*_*kov 20

从Ruby 2.3.0开始,您可以将安全导航operator(&.)与Numeric#nonzero?.如果实例是和,则&.返回- 如果数字为:nilnilnonzero?0

if discount&.nonzero?
  # ...
end
Run Code Online (Sandbox Code Playgroud)

或后缀:

do_something if discount&.nonzero?
Run Code Online (Sandbox Code Playgroud)

  • @TomLord,如前面的评论所述,这并不适用于任意对象.相反,它关注的情况是,你知道的东西应该是一个数字,但也可能是"nil". (2认同)

Rai*_*kis 17

if (discount||0) != 0
  #...
end
Run Code Online (Sandbox Code Playgroud)


Jer*_*ten 14

你可以这样做:

if (!discount.nil? && !discount.zero?)
Run Code Online (Sandbox Code Playgroud)

这里的顺序很重要,因为如果discountnil,那么它就没有zero?方法.Ruby的短路评估应该阻止它试图评估discount.zero?,如果discount是的话nil.


oiv*_*doo 11

您可以将空行转换为整数值并检查零?

"".to_i.zero? => true
nil.to_i.zero? => true
Run Code Online (Sandbox Code Playgroud)