我没有使用Ruby的经验,所以我的代码感觉“丑陋”且不习惯:
def logged_in?
!user.nil?
end
我宁愿有类似的东西
def logged_in?
user.not_nil?
end
但是找不到相反的方法 nil?
Answers:
当您使用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
false.present? == false
!false.nil? == true
您似乎过于关心布尔值。
def logged_in?
user
end
如果用户为零,那么login_in?将返回“假”值。否则,它将返回一个对象。在Ruby中,我们不需要返回true或false,因为我们具有JavaScript中的“ truthy”和“ falsey”值。
更新资料
如果您使用的是Rails,可以使用以下present?
方法使此内容更好看:
def logged_in?
user.present?
end
?
是返回一个布尔值。!!value
是将任何内容转换为布尔值的经典方法。不完全一样,但是在这种情况下Object#present?
,RoR也不错。
当心其他答案present?
作为您的问题的答案。
present?
与blank?
in rails相反。
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?
present?
将查询您的数据库,nil?
不会,请小心
也许这是一种方法:
class Object
def not_nil?
!nil?
end
end
!self.nil?
而不是!nil?
,或者是self
隐含的?
我可以在!
方法结果上提供Ruby-esquenil?
方法。
def logged_in?
user.nil?.!
end
如此深奥的是,RubyMine IDE会将其标记为错误。;-)
我遇到了这个问题,寻找对象方法,以便可以使用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
呢?
map
在本例中,为简单起见,我在原著中还有其他一些逻辑,因此在编写时可以与互换values_at
。重要的是传递给的内容find
。
present?
需要一个非空白的字符串。! "".nil?
返回true,但"".present?
返回false。