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

「foo.nil??nil:foo.to_i」の簡潔なRubyイディオム?

4

8 に答える 8

6

またはもう少し短い(そうfooであるとは思わない場合false

def bar(foo)
  foo.to_i if foo
end
于 2012-04-27T10:42:05.633 に答える
4
foo and foo.to_i

ブール演算子は短絡し、最後に評価された式の値を返します。

  • foo is の場合はnil返され、foo.to_i実行されません。
  • foo ではない 場合nilfoo.to_iが評価され、その結果が返されます。
于 2012-04-27T14:47:00.237 に答える
4
def bar(foo)
  foo.to_i unless foo.nil?
end

しかし、IMO を排除することを除いて、実際には何も得られません? ?。これは 1 文字短く、Ruby の知識があれば読みやすい可能性があります。三項よりも「より簡潔」と見なされるため、わかりません。

(この場合、自明ではない動作と見なされる可能性があるため、「潜在的に」と言いますnil。)

于 2012-04-27T10:41:04.097 に答える
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

andandgemを使用します

http://andand.rubyforge.org/

これは私が行くことを可能にします:

foo.andand.to_i

これは、fooがnilの場合はnilを返し、それ以外の場合はto_iを返します。

于 2012-04-27T11:18:43.733 に答える