def bar(foo)
foo.nil? ? nil : foo.to_i
end
“foo.nil??nil:foo.to_i”的任何简洁的Ruby习语?
答案 0 :(得分:6)
或者稍微短一些(如果你不希望foo
成为false
)
def bar(foo)
foo.to_i if foo
end
答案 1 :(得分:4)
def bar(foo)
foo.to_i unless foo.nil?
end
但除了取消? ?
之外,你并没有真正获得任何东西,IMO。如果您了解Ruby,那么它的字符更短,可能更具可读性。不知道它有资格作为"更简洁"比三元。
(我说"可能"因为在nil
案例中可能被认为是非显而易见的行为。)
答案 2 :(得分:4)
foo and foo.to_i
布尔运算符short circuit并返回最后一个表达式的值。
foo
nil
,则会返回该文件,并且不会执行foo.to_i
。foo
不是 nil
,则会评估foo.to_i
并返回其结果。答案 3 :(得分:3)
如果您使用rails中的ActiveSupport,则可以使用try
方法
foo.try(:to_i)
答案 4 :(得分:2)
如果你碰巧真的想要这个成语的破坏性版本,即
foo = (foo.nil? ? nil : foo.to_i)
然后你可以做
foo &&= foo.to_i
答案 5 :(得分:1)
答案 6 :(得分:1)
适当的红宝石成语是
foo && foo.to_i
但是,ruby 2.3.0在红宝石社区中为safe navigation operator引入了some reason,也称为“孤独运算符”。使用它,您可以编写相同的内容:
foo&.to_i
达到同样的效果。
PS:有些人hate。
玩得开心。
答案 7 :(得分:0)
Idiomatic way to write Ruby code
我们可以用4种不同的方式编写代码:
使用if
:
def bar(foo)
foo.to_i if foo
end
使用unless
:
def bar(foo)
foo.to_i unless foo.nil?
end
如果使用Rails,则使用try
方法:
def bar(foo)
foo.try(:to_i)
end
如果使用Ruby 2.3.x,则使用&.
运算符(Ruby安全导航运算符):
def bar(foo)
foo&.to_i
end
对于更多Idiomatic way to write Ruby code,我读了一篇关于此事的优秀文章。