我不太熟悉 Ruby,所以我的代码感觉“丑陋”而且不符合惯用语法:
def logged_in?
!user.nil?
end
我更喜欢像这样的东西def logged_in?
user.not_nil?
end
但是找不到与 nil?
相反的方法。
我不太熟悉 Ruby,所以我的代码感觉“丑陋”而且不符合惯用语法:
def logged_in?
!user.nil?
end
我更喜欢像这样的东西def logged_in?
user.not_nil?
end
但是找不到与 nil?
相反的方法。
你似乎过于关注布尔值。
def logged_in?
user
end
如果用户为空,则logged_in?将返回“falsey”值。否则,它将返回一个对象。在Ruby中,我们不需要返回true或false,因为我们有像JavaScript中的“truthy”和“falsey”值。def logged_in?
user.present?
end
当你使用 ActiveSupport 时,可以使用 user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-present%3F来检查非nil值,为什么不使用
def logged_in?
user # or !!user if you really want boolean's
end
present?
要求一个非空字符串。! "".nil?
返回 true,但是 "".present?
返回 false。 - lambshaanxyfalse.present? == false
!false.nil? == true
- Dudo注意其他回答中提出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
。其他任何内容:空字符串、0
、false
等都不是nil
。
present?
非常有用,但绝对不是nil?
的相反。混淆这两个可能会导致意想不到的错误。
对于您的用例,present?
将起作用,但始终要注意区别。
false.blank?
不同于 false.nil?
。 - Yasonpresent?
会查询你的数据库,而nil?
则不会,使用时要小心。 - Tony也许这可能是一种方法:
class Object
def not_nil?
!nil?
end
end
!nil?
,而是 !self.nil?
,因为 self
是隐式的吗? - berkes我可以建议在nil?
方法的结果上使用类似Ruby中的!
方法。
def logged_in?
user.nil?.!
end
这个东西太深奥了,以至于RubyMine IDE会将其标记为错误。 ;-)
您可以直接使用以下代码:
if object
p "object exists"
else
p "object does not exist"
end
这不仅适用于nil,还适用于false等情况,因此您应该测试以查看它在您的用例中是否有效。
Symbol#to_proc
简写而不是块;我认为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)
正如其他回答所指出的那样,如果您正在测试布尔值,这种方法将会失败。
最初的回答:原始答案
my_hash.values_at("Name", "name").find
有什么不同? - berkes
?
结尾的方法为例,我们期望它返回一个布尔值。!!value
是将任何东西转换为布尔值的经典方式。虽然不完全相同,但在这种情况下,RoR 中的Object#present?
也是一个不错的选择。 - tokland.present?
不是.nil?
的相反。事实上,它是.blank?
的相反。 - Juan Ignacio Marquezarray.present?
,当数组不为空时它返回了false,而实际上数组是空的。所以实际上array.nil?
和array.present?
都返回了false。所以array.present?
并不是array.nil?
的相反,因为相反意味着两者不能同时为真或假。 - undefined.present?
并不真正是.nil?
的相反,这正是问题标题所要求的。问题本身明确表示OP正在寻找一种确定变量是否具有非空值的方法,因此.present?
是推荐的,尽管它不是标题指定的内容。这不是我今天回答问题的语气和格式,但这是一个13年前的回答。我感谢你的纠正。 - undefined