Rubyに条件付きラムダを書いてみたいと思います。私が書きたいのですが何のPythonのと同等です:動作しません。残念ながらRubyで条件付きラムダを書くには?
even = -> (x) {x if x % 2 == 0 else 0}
、:Rubyでこれを書くために
even = (lambda x: x if x % 2 == 0 else 0)
私の試みは次のようになります。これを修正する方法はありますか?
Rubyに条件付きラムダを書いてみたいと思います。私が書きたいのですが何のPythonのと同等です:動作しません。残念ながらRubyで条件付きラムダを書くには?
even = -> (x) {x if x % 2 == 0 else 0}
、:Rubyでこれを書くために
even = (lambda x: x if x % 2 == 0 else 0)
私の試みは次のようになります。これを修正する方法はありますか?
を持っています。末尾if
またはunless
がelse
のような二次的条件を持つことができないという
if (x % 2 == 0)
x
else
0
end
注:長い形式はこれです。フルフォームを使用する必要があります。
あなたは短いバージョンをしたい場合は、あなたが三項演算子使用:
何も行うことができますが、このです(x % 2 == 0) ? x : 0
:他の人がeven?
と呼ばれる方法があります観察してきたように
(x % 2 == 0) and x or 0
をあなたのためにモジュロを行いますので、これをさらに崩壊させることができます:
x.even? ? x : 0
Rubyの三項演算子は、あなたがこれを表現するために、ここでいくつかのオプションがあり、この構文
x % 2 == 0 ? x : 0
条件は必要ありません。
p = ->(x) { x*(1-x%2) }
p.call(4) #=> 4
p.call(5) #=> 0
注procsのは、複数の方法で呼び出すことができます。これらの
p[4] #=> 4
p.(4) #=> 4
p.yield(4) #=> 4
p === 4 #=> 4
p(4) #=> 4
最後は時代遅れかもしれません。
誤った構文です。あなたはこのようにそれを書くことができます。他には、このスレッドで示唆したように、演算子?:
even = -> (x) {if x % 2 == 0; x; else; 0; end}
しかし、そのようなワンライナーのために、三元を使用する方が一般的です。
あなたの構文が間違っている:
then
キーワード、セミコロンまたは改行で条件から切り離されています。end
というキーワードで終了します。ので、次のいずれかが有効です。
# idiomatic:
if x % 2 == 0 then x else 0 end
# idiomatic:
if x % 2 == 0
x
else
0
end
# non-idiomatic:
if x % 2 == 0; x else 0 end
# non-idiomatic:
if x % 2 == 0 then
x
else
0
end
# non-idiomatic:
if x % 2 == 0
x else 0 end
# … and many other non-idiomatic variations
Rubyはまた、条件演算子があります。
x % 2 ? x : 0
をしかし、私は個人的には醜いと読めない見つけます。また、条件式とは異なる優先順位を持ちますが、これは驚くかもしれません。 (ここでStackOverflowの条件演算子に関する同じ質問のバリエーションが数多くあります。)Cでは、if
が条件文であるため、式であるため条件演算子が必要です。 Rubyでは、すべてがとにかく式ですが、ステートメントがないので、もちろんif
も式です。
また、 'lambda do | x |もしx.evenなら?その後、x else 0 end end'となる。 Rubyの多くのオプション。 TIOOWTDIの脳をきれいにする:P – Amadan