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

有没有红宝石,或者说红宝石是不等于零的?与零相反?方法?

  •  78
  • berkes  · 技术社区  · 14 年前

    我对Ruby没有经验,所以我的代码感觉“丑陋”,而且不惯用:

    def logged_in?
      !user.nil?
    end
    

    我想吃点像

    def logged_in?
      user.not_nil?
    end
    

    但找不到这样一种方法 nil?

    6 回复  |  直到 5 年前
        1
  •  48
  •   lwe    10 年前

    当你使用ActiveSupport时, user.present? http://api.rubyonrails.org/classes/Object.html#method-i-present%3F ,检查是否为非零,为什么不使用

    def logged_in?
      user # or !!user if you really want boolean's
    end
    
        2
  •  48
  •   Samo    10 年前

    你似乎过于关心胸部。

    def logged_in?
      user
    end
    

    如果用户为零,则登录?将返回“假”值。否则,它将返回一个对象。在Ruby中,我们不需要返回true或false,因为我们有“truthy”和“false”值,就像在JavaScript中一样。

    更新

    如果您使用的是Rails,则可以使用 present? 方法:

    def logged_in?
      user.present?
    end
    
        3
  •  15
  •   Geo    14 年前

    也许这是一种方法:

    class Object
      def not_nil?
        !nil?
      end
    end
    
        4
  •  13
  •   A Fader Darkly    7 年前

    注意其他答案 present? 作为你问题的答案。

    在场吗? 与…相反 blank? 在铁轨上。

    在场吗? 检查是否存在有意义的值。这些事情可能会失败 在场吗? 检查:

    "".present? # false
    "    ".present? # false
    [].present? # false
    false.present? # false
    YourActiveRecordModel.where("false = true").present? # false
    

    鉴于A !nil? 检查给出:

    !"".nil? # true
    !"    ".nil? # true
    ![].nil? # true
    !false.nil? # true
    !YourActiveRecordModel.where("false = true").nil? # true
    

    nil? 检查对象是否 nil . 其他任何东西:空字符串, 0 , false 不管怎样,不是 .

    在场吗? 非常有用,但绝对不是 零? . 混淆两者会导致意外错误。

    用于您的用例 在场吗? 会有效果的,但要知道两者的区别总是明智的。

        5
  •  4
  •   Bitterzoet    14 年前

    您只需使用以下内容:

    if object
      p "object exists"
    else
      p "object does not exist"
    end
    

    这不仅适用于nil,也适用于false等,所以您应该测试一下它是否适用于您的用例。

        6
  •  1
  •   Ian    5 年前

    我提出这个问题是为了寻找一个对象方法,以便使用 Symbol#to_proc shorthand 而不是一个街区;我发现 arr.find(&:not_nil?) arr.find { |e| !e.nil? } .

    我找到的方法是 Object#itself . 在我的用法中,我想在哈希中查找键的值 name ,在某些情况下,该键意外大写为 Name . 这一行如下:

    # Extract values for several possible keys 
    #   and find the first non-nil one
    ["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
    

    如中所述 other answers ,在您测试布尔值的情况下,这将非常失败。