0

include?明示的なリターンと暗黙的なリターンの違いを調べるために、自己定義のメソッドを使用しています。反復処理されたコレクションを返すことを理解している#eachので、真/偽の暗黙の戻り値を正しい場所に配置する必要があると思いますが、そうするとコレクションが戻ってきて、何を変更すればよいかわかりません。

def self.include?(array, search_item)
  array.each do |elem|
    if elem == search_item
      true
    end
  end
end

以下は私がチェックしているテストですが、返品を正しく一致させる方法がわかりません。それらが一致しないのはなぜですか、または暗黙的な戻り値の範囲をどのように理解する必要がありますか?

  result = MethodReturns.include?(numbers_array, 4)
  expect(result).to eq(true)

  result = MethodReturns.include?(numbers_array, 7)
  expect(result).to eq(false)
4

3 に答える 3

3

次のように変更します。

def self.include?(array, search_item)
  array.each do |elem|
    if elem == search_item
      return true
    end
  end
  return false
end

これは、メソッドの最後のステートメントが戻り値であるためです。あなたの場合、一致がない場合は false を返すことはありません。returnブレークアウトしたい場合は必ず を追加し、メソッドの残りの実行をすぐに停止してください。

于 2014-06-20T21:10:55.053 に答える
2

returnブロック内で明示的に使用するeachと、そのコードに到達するとすぐに値が返されます (反復が停止します)。これは、ブロックの非ローカル リターン機能によるものです。

Ruby のブロックは非ローカル リターンをサポートしています。つまり、ブロックからのリターンは、ブロックの元のコンテキストからのリターンと同じように動作します。

したがって、明示的に使用するだけでコードが適切に機能するはずですreturn

def self.include?(array, search_item)
  array.each do |elem|
    if elem == search_item
      return true
    end
  end
end
于 2014-06-21T08:16:18.673 に答える
2

実行された LAST ステートメントは、戻り値を提供します。each() ループで発生する最後のことは、常にループの終わりになります (return や break など、何らかの方法でループから抜け出さない限り):

def do_stuff()
  [1, 2, 3]. each do |num|
    true if num == num
  end
end

p do_stuff

--output:--
[1, 2, 3]

したがって、真の値は破棄され、each() ループが終了するまで each() の反復が続行されます。ご存知のように、each() ループが終了すると左側が返されます。

暗黙的に true を返すメソッドの例を次に示します。

def do_stuff()
  [1, 2, 3]. each do |num|
    #blah
  end

  true
end

each() メソッドは引き続き配列を返しますが、each() メソッドは do_stuff() メソッドで実行される最後のステートメントではありません。

あなたの例では、これを行うことができます:

def do_stuff(target)
  found = false

  [1, 2, 3]. each do |num|
    found = true if num == target
  end

  found
end


p do_stuff(2)

--output:--
true

ただし、一致が見つかった後、 each() メソッドが Array を繰り返し処理し続けるため、このソリューションはリソースを浪費します。たとえば、Array に 100 万個の要素があり、Array のインデックス 0 で一致が見つかった場合、each() メソッドは残りの 999,999 個の要素を不必要に反復し続けます。一方、一致が見つかったときに明示的に戻ると、ループが終了します。

と明示的に書くことは決して間違いではありませんreturn val。より経験を積むにつれて、適切な場合は戻り部分を削除して、Ruby を知っていることを世界に示すことがreturnできます。

于 2014-06-20T21:06:36.513 に答える