Ruby的成语是“foo.nil??nil:foo.to_i”?

时间:2012-04-27 10:37:00

标签: ruby idioms

def bar(foo)
  foo.nil? ? nil : foo.to_i
end

“foo.nil??nil:foo.to_i”的任何简洁的Ruby习语?

8 个答案:

答案 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)

我使用and和gem

http://andand.rubyforge.org/

这允许我去:

foo.andand.to_i

如果foo为null,则返回nil,或者to_s else。

答案 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,我读了一篇关于此事的优秀文章。