2016-09-07 7 views
1

Rubyに条件付きラムダを書いてみたいと思います。私が書きたいのですが何のPythonのと同等です:動作しません。残念ながらRubyで条件付きラムダを書くには?

even = -> (x) {x if x % 2 == 0 else 0} 

、:Rubyでこれを書くために

even = (lambda x: x if x % 2 == 0 else 0) 

私の試みは次のようになります。これを修正する方法はありますか?

答えて

3

を持っています。末尾ifまたはunlesselseのような二次的条件を持つことができないという

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 
2

Rubyの三項演算子は、あなたがこれを表現するために、ここでいくつかのオプションがあり、この構文

x % 2 == 0 ? x : 0 
+1

また、 'lambda do | x |もしx.evenなら?その後、x else 0 end end'となる。 Rubyの多くのオプション。 TIOOWTDIの脳をきれいにする:P – Amadan

1

条件は必要ありません。

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 

最後は時代遅れかもしれません。

0

誤った構文です。あなたはこのようにそれを書くことができます。他には、このスレッドで示唆したように、演算子?:

even = -> (x) {if x % 2 == 0; x; else; 0; end} 

しかし、そのようなワンライナーのために、三元を使用する方が一般的です。

0

あなたの構文が間違っている:

  • そして - ブロックは、条件の後に、それはないの前に来ます。
  • 次に -blockは、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も式です。

関連する問題