2017-01-13 14 views
2

私は私がこのように成功し、それを書くことができます知っている:ブロック内に割当ててブレークする方法はありますか?

def test_find_first_multiple_of_3 
    numbers = [2, 8, 9, 27, 24, 5] 
    found = nil 
    numbers.each do |number| 
    if number % 3 == 0 
     found = number 
     break 
    end 
    end 
    assert_equal 9, found 
end 

は、ブロック内で行うにはとにかくはありますか?私は何が欠けていますか?それともできないのですか?

found = numbers.find { |n| (n % 3).zero? } 

この方法で、あなたのループを切断する必要はありません。他の回答で指摘したように

numbers.each { |n| n % 3 == 0 ? (found = n then break) : nil } 

def test_find_first_multiple_of_3 
    numbers = [2, 8, 9, 27, 24, 5] 
    found = nil 
    numbers.each { |n| n % 3 == 0 ? (found = n then break) : nil } 
    assert_equal 9, found 
end 
+0

は ''(= Nその後、壊れた)のようなものをしないでください使用することができます。条件付きテストのミキシング割り当ては、意図しない割り当てのように見えるため、読みやすさやメンテナンスに害を及ぼし、3AMで破損するプロダクションコードでは、プログラミングの選択肢が少ないため、実際に同僚を苛立たせる可能性があります。簡潔なコードを書けるからといって、私たちはすべきではありません。 –

答えて

4

.find方法を使用してのように、自分のアルゴリズムの目標を達成するために、他のルビーの方法があります。あなたがそうしたい場合

しかし、は、特にあなたの質問に答える、同じ行にループを破るためにいくつかの方法があります:

  • は使用;(複数のステートメントは、セパレータ):

    numbers.each { |n| n % 3 == 0 ? (found = n; break) : nil } 
    
  • あなたの譲り受けた後のあなたの義務を置くこともできます:

    numbers.each { |n| n % 3 == 0 ? (break found = n) : nil } 
    

私はちょうど「読みやすさとメンテナンスを痛い」だけでなく@Theブリキ男が指す、ため、再び、それは、良いpraticeはありませんが、例のコードを使用しますが、。

また、@akuhnが指摘するように、ここではternaryを使用する必要はありません。あなたは、単に使用することができます。

numbers.each { |n| break found = n if n % 3 == 0 } 

**はdoesnのこと、彼のタスクを実行するための他の選択肢があることをOPに警告するために、@Theブリキ男、@akuhnと@Eric Duminilからの提案を含めるように編集しますループを壊す必要はありません。元の回答は、OPの質問に具体的に答えるために書かれたものです(1行の改行ループ)。コード構造の懸念はありません。一般的なルビーで

+0

ありがとう、MR LEW! –

+1

ブランチの単純な値よりも複雑なものを含む3値ステートメントは、読みやすさとメンテナンスを傷つけるので注意してください。代わりに、標準の 'if' /' else'を使用してください。三項文は非常にシンプルでなければならない。 –

+1

三項関係の必要がなければ、 'numbers.each {| n | \ n%3 == 0の場合はブレークが見つかりました。\\\ " – akuhn

1

は、あなたの缶の書き込みをイディオム:

def test_find_first_multiple_of_3 
    numbers = [2, 8, 9, 27, 24, 5] 
    found = numbers.find { |n| (n % 3).zero? } 

    assert_equal 9, found 
end 
0

あなたが一致する最初の項目を見つけるために、列挙方法findを使用することができます。通常、あなたは理解を維持しながら、コードをよりコンパクトにするためにcycledetecteachreject、および他のような列挙方法を使用したいと思うでしょう:

def test_find_first_multiple_of_3 
    numbers = [2, 8, 9, 27, 24, 5] 
    found = numbers.find { |number| number % 3 == 0 } 
    assert_equal 9, found 
end 
+1

。ありがとうルドルフ。この特定の状況では、私はそれぞれの方法を使いたいだけでした。私は私の質問の中で述べるべきです。私の間違い。 –

1

はい、breaknext両方の引数を取ります。ご例えば

しかし、Rubyで一般的に最善の利用find

founds = numbers.find { |n| n % 3 == 0 } 

は、ループの外breakの理由はほとんどありません。

通常はfindまたはtake_whiledrop_whileのような可算モジュールが提供する他の機能、のいずれか...

関連する問題