def bar(foo)
foo.nil? ? nil : foo.to_i
end
“foo.nil? ? nil : foo.to_i” 的任何简明 Ruby 习语?
或者更短一点(如果你不希望foo
是false
)
def bar(foo)
foo.to_i if foo
end
def bar(foo)
foo.to_i unless foo.nil?
end
但是你并没有真正获得任何东西,IMO,除了消除? ?
. 如果您了解 Ruby ,它是一个更短的字符,可能更具可读性。不知道,因为它比三元更“简洁”。
(我说“可能”是因为在这种情况下它可能被认为是不明显的行为nil
。)
foo and foo.to_i
布尔运算符短路并返回最后评估的表达式的值。
foo
是 nil
,它将被返回并且foo.to_i
不会被执行。foo
不是 nil
,foo.to_i
将被评估并返回其结果。如果您使用 Rails 中的 ActiveSupport,您可以使用try
方法编写它
foo.try(:to_i)
如果你碰巧真的想要这个成语的破坏性版本,即
foo = (foo.nil? ? nil : foo.to_i)
那么你可以做
foo &&= foo.to_i
正确的红宝石成语是
foo && foo.to_i
然而,ruby 2.3.0引入了安全导航算子,由于某种原因在 ruby 社区中也被称为“孤独算子”。使用它,您可以编写与以下内容相同的内容:
foo&.to_i
达到同样的效果。
PS:有些人讨厌它。
玩得开心。
我们可以用 4 种不同的方式编写代码:
使用if
:
def bar(foo)
foo.to_i if foo
end
使用unless
:
def bar(foo)
foo.to_i unless foo.nil?
end
try
如果使用 Rails,则使用方法:
def bar(foo)
foo.try(:to_i)
end
如果使用 Ruby 2.3.x,则使用&.
运算符(Ruby 安全导航运算符):
def bar(foo)
foo&.to_i
end
有关编写 Ruby 代码的更多惯用方式,我阅读了一篇关于此的优秀文章。