11

returnブロック、プロシージャ、ラムダで どのように機能するかを理解するのに多くの問題があります。

たとえば、次の場合、エラーをスローしbatman_ironman_procながら、なぜ機能するのですか?batman_yield

def batman_ironman_proc
  victor = Proc.new { return "Batman will win!" }
  victor.call
  "Iron Man will win!"
end

def batman_yield
    yield
    "Iron man will win!"
end

victor = Proc.new { return "Batman will win!" }

puts batman_ironman_proc 
#batman_yield(&victor) === This code throws an error.
4

2 に答える 2

9

リンクされた質問の1つの回答が示すように:

returnキーワードは常に、現在のコンテキストのメソッドまたはラムダから返されます。ブロックでは、クロージャーが定義されたメソッドから戻ります。呼び出し元のメソッドまたはラムダから返すことはできません。

最初の例はvictor、戻りたい同じ関数で定義したため成功したためreturn、そのコンテキストでは a が正当でした。2番目の例でvictorは、最上位で定義されていました。その場合、その効果は(呼び出し元のメソッド)から戻ることreturnではなくbatman_yield、[それが有効な場合] トップレベル自体 (Procが定義されている場所) から戻ることになります。

明確化:ブロックの戻り値にアクセスできますが(つまり、「ブロックで評価された最後の式の値は、利回りの値としてメソッドに返されます」-コメントに従って)、使用できませんreturn上記の理由により、キーワード。例:

def batman_yield
    value = yield
    return value
    "Iron man will win!"
end

victor = Proc.new { return "Batman will win!" }
victor2 = Proc.new { "Batman will win!" }

#batman_yield(&victor) === This code throws an error.
puts batman_yield(&victor2) # This code works fine.
于 2013-03-22T05:20:51.160 に答える