【发布时间】:2023-03-04 21:03:01
【问题描述】:
我没有 Ruby 方面的经验,所以我的代码感觉“丑陋”且不习惯:
def logged_in?
!user.nil?
end
我宁愿有类似的东西
def logged_in?
user.not_nil?
end
但是找不到这样对立的方法nil?
【问题讨论】:
标签: ruby-on-rails ruby null
我没有 Ruby 方面的经验,所以我的代码感觉“丑陋”且不习惯:
def logged_in?
!user.nil?
end
我宁愿有类似的东西
def logged_in?
user.not_nil?
end
但是找不到这样对立的方法nil?
【问题讨论】:
标签: ruby-on-rails ruby null
我可以根据nil? 方法的结果提供Ruby 风格的! 方法吗?
def logged_in?
user.nil?.!
end
如此深奥以至于 RubyMine IDE 会将其标记为错误。 ;-)
【讨论】:
我来到这个问题是为了寻找一个对象方法,这样我就可以使用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 中所述,在您测试布尔值的情况下,这将失败。
【讨论】:
my_hash.values_at("Name", "name").find有什么不同?
map 中还有一些其他逻辑,为了简单起见,我在本例中删除了这些逻辑,所以这里写的它可以与values_at 互换。重要的部分是传递给find。
请注意其他将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? 不同
present? 将查询您的数据库,nil? 不会,请注意
当您使用 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
【讨论】:
present? 需要一个非空字符串。 ! "".nil? 返回 true,但 "".present? 返回 false。
false.present? == false !false.nil? == true
您似乎过于关心布尔值。
def logged_in?
user
end
如果用户为nil,那么logged_in?将返回一个“假”值。否则,它将返回一个对象。在 Ruby 中,我们不需要返回 true 或 false,因为我们在 JavaScript 中具有“truthy”和“falsey”值。
更新
如果您使用的是 Rails,则可以通过使用 present? 方法使这篇文章更好地阅读:
def logged_in?
user.present?
end
【讨论】:
? 结尾的方法的期望是它返回一个布尔值。 !!value 是将任何内容转换为布尔值的经典方法。不完全一样,但在这种情况下,RoR 中的 Object#present? 也不错。
您可以使用以下内容:
if object
p "object exists"
else
p "object does not exist"
end
这不仅适用于 nil,也适用于 false 等,因此您应该测试它是否适用于您的用例。
【讨论】:
也许这可能是一种方法:
class Object
def not_nil?
!nil?
end
end
【讨论】:
!self.nil? 而不是!nil?,还是selfimplicit?