代码之家  ›  专栏  ›  技术社区  ›  hectorsq

在ruby中检查变量是否为nil和非零

  •  224
  • hectorsq  · 技术社区  · 17 年前

    我使用下面的代码来检查变量是否为nil和非零

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

    16 回复  |  直到 11 年前
        1
  •  464
  •   Dejan Simic    15 年前
    除非打折。无折扣==0
    # ...
    终止
    
        2
  •  41
  •   madlep    17 年前
    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
    

        3
  •  33
  •   rewritten    7 年前

    好吧,5年过去了。。。。

    if discount.try :nonzero?
      ...
    end
    

    try 是在ActiveSupport gem中定义的,因此在普通ruby中不可用。

        4
  •  31
  •   ndnenkov    10 年前

    从Ruby 2.3.0开始,您可以组合安全导航操作符( &. )与 Numeric#nonzero? &. 返回 nil nonzero? -如果号码是 0 :

    if discount&.nonzero?
      # ...
    end
    

    或后缀:

    do_something if discount&.nonzero?
    
        5
  •  28
  •   Dejan Simic    17 年前
    除非[nil,0]。包括?(折扣)
    # ...
    终止
    
        6
  •  20
  •   Paige Ruten    17 年前

    您可以这样做:

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

    订单在这里很重要,因为如果 discount nil ,那么它就不会有 zero? 方法Ruby的短路评估应该阻止它尝试评估 discount.zero? 折扣

        7
  •  17
  •   Raimonds Simanovskis    17 年前
    if (discount||0) != 0
      #...
    end
    
        8
  •  11
  •   oivoodoo    13 年前

    您可以将空行转换为整数值并选中零?。

    "".to_i.zero? => true
    nil.to_i.zero? => true
    
        9
  •  3
  •   rubyprince    15 年前
    if discount and discount != 0
      ..
    end
    

    更新,它会 false 对于 discount = false

        10
  •  3
  •   Dave G-W    11 年前

    你可以利用这个机会 NilClass 假如 #to_i 方法,该方法将为 nil 价值观:

    unless discount.to_i.zero?
      # Code here
    end
    

    如果 discount 可以是小数,您可以使用 #to_f 相反,要防止数字四舍五入为零。

        11
  •  3
  •   Saroj    10 年前
    def is_nil_and_zero(data)
         data.blank? || data == 0 
    end  
    

    如果我们通过“”,它将返回false,而为空?返回true。 数据=false时的情况也是如此 空白的对于nil、false、空或空白字符串,返回true。

        12
  •  1
  •   pastullo    10 年前

    数据库记录 ,我希望使用迁移帮助程序使用0初始化所有空值:

    add_column :products, :price, :integer, default: 0
    
        13
  •  1
  •   Abhinay Reddy Keesara    10 年前
    if discount.nil? || discount == 0
      [do something]
    end
    
        14
  •  1
  •   Ozesh    6 年前

    我更喜欢使用更干净的方法:

    val.to_i.zero?
    

    val.to_i 0 如果 是一个 nil

    之后,我们需要做的就是检查最终值是否为a .

        15
  •  1
  •   NIshank    5 年前

    discount.to_f.zero?
    

    此支票可处理大量情况,即折扣可能为零,折扣可能为整数0,折扣可能为浮动0.0,折扣可能为字符串“0.0”,“0”。

        16
  •  0
  •   Ed Swangren    17 年前

    您可以将折扣初始化为0,只要保证代码在初始化之前不会尝试使用折扣。我想那会去掉一张支票,我想不出其他的了。

        17
  •  -1
  •   RichOrElse    7 年前

    module Nothingness
      refine Numeric do
        alias_method :nothing?, :zero?
      end
    
      refine NilClass do
        alias_method :nothing?, :nil?
      end
    end
    
    using Nothingness
    
    if discount.nothing?
      # do something
    end
    
        18
  •  -7
  •   Andrew Grimm Alex Wayne    15 年前

    我相信下面的内容对于ruby代码来说已经足够好了。我不认为我可以编写一个单元测试来显示这与原始测试之间的任何差异。

    if discount != 0
    end
    
    推荐文章