是否存在用于not_nil的Ruby或Ruby-ism?零对面?方法?

时间:2010-10-25 08:04:57

标签: ruby-on-rails ruby null

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

def logged_in?
  !user.nil?
end

我宁愿拥有像

这样的东西
def logged_in?
  user.not_nil?
end

但找不到与nil?

对立的方法

7 个答案:

答案 0 :(得分:48)

当您使用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

答案 1 :(得分:48)

你似乎过分担心布尔人。

def logged_in?
  user
end

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

<强>更新

如果你正在使用Rails,你可以使用present?方法更好地阅读:

def logged_in?
  user.present?
end

答案 2 :(得分:15)

也许这可能是一种方法:

class Object
  def not_nil?
    !nil?
  end
end

答案 3 :(得分:14)

请注意提出present?的其他答案作为您问题的答案。

present?与rails中的blank?相反。

present?检查是否有有意义的值。这些事情可能会导致present?检查失败:

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

!nil?支票给出:

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

nil?检查对象是否实际为nil。还有别的:空字符串,0false,等等,不是nil

present?非常有用,但绝对不是nil?的反面。混淆两者可能会导致意外错误。

对于您的用例present?将起作用,但了解其中的区别总是明智的。

答案 4 :(得分:4)

您可以使用以下内容:

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

这不仅适用于nil,也适用于false等,因此您应该测试它是否在您的用例中运行。

答案 5 :(得分:1)

我遇到了这个问题,正在寻找一种对象方法,因此我可以使用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中所述,在测试布尔值的情况下,此操作将严重失败。

答案 6 :(得分:0)

我可以针对background-image: url(${LogoImage}); background-repeat:no-repeat; background-position: center center; background-attachment: fixed; 方法的结果提供Ruby-esque background: url(${LogoImage}) no-repeat center center fixed; 方法。

!

太深了,RubyMine IDE会将其标记为错误。 ;-)