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

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

4

8 回答 8

6

或者更短一点(如果你不希望foofalse

def bar(foo)
  foo.to_i if foo
end
于 2012-04-27T10:42:05.633 回答
4
def bar(foo)
  foo.to_i unless foo.nil?
end

但是你并没有真正获得任何东西,IMO,除了消除? ?. 如果您了解 Ruby ,它是一个更短的字符,可能更具可读性。不知道,因为它比三元更“简洁”。

(我说“可能”是因为在这种情况下它可能被认为是不明显的行为nil。)

于 2012-04-27T10:41:04.097 回答
4
foo and foo.to_i

布尔运算符短路并返回最后评估的表达式的值。

  • 如果foo nil,它将被返回并且foo.to_i不会被执行。
  • 如果foo 不是 nilfoo.to_i将被评估并返回其结果。
于 2012-04-27T14:47:00.237 回答
3

如果您使用 Rails 中的 ActiveSupport,您可以使用try方法编写它

foo.try(:to_i)
于 2012-04-27T19:27:57.160 回答
2

如果你碰巧真的想要这个成语的破坏性版本,即

foo = (foo.nil? ? nil : foo.to_i)

那么你可以做

foo &&= foo.to_i
于 2014-05-08T05:26:04.657 回答
1

我使用 andand gem

http://andand.rubyforge.org/

这让我可以去:

foo.andand.to_i

如果 foo 为 nil,则返回 nil,否则返回 to_i。

于 2012-04-27T11:18:43.733 回答
1

正确的红宝石成语是

foo && foo.to_i

然而,ruby 2.3.0引入了安全导航算子,由于某种原因在 ruby​​ 社区中也被称为“孤独算子”。使用它,您可以编写与以下内容相同的内容:

foo&.to_i

达到同样的效果。

PS:有些人讨厌它。

玩得开心。

于 2016-05-25T20:05:33.847 回答
0

编写 Ruby 代码的惯用方式

我们可以用 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 代码的更多惯用方式,我阅读了一篇关于此的优秀文章。

于 2017-04-23T02:18:11.277 回答