2012/01/02

出番があるようでないnext

プログラミング言語 Rubyより

returnを囲っているメソッドは、returnを呼び出してきたメソッドとは必ずしも同じではない。ブロック内でreturn文を使うと、ブロックが終了するだけでは話は終わらない。そして、ブロックを呼び出したイテレータが終了してもまだ話は終わりではない。return文があると、いつでもreturnを囲っているメソッドが終了するのである。囲っているメソッドは、字句的に囲っている(exically enclosing)メソッドとも呼ばれ、ソースコードを見たときにブロックを囲っているメソ\ッドのことである。

プログラミング言語 Ruby 第2版 153ページ return
def find(array, target)
  array.each_with_index do |element, index|
    return index if (element == target) # findから戻る
  end
  nil # 要素が見つからなければnilを返す
end

これに対して、ブロック内では、nextの後の式や式リストは、ブロックを呼び出したyield文の「戻り値」になる。nextの後に式がなければ、yieldの値はnilになる。

# 157ページより
squareroots = data.collect do |x|
  next 0 if x < 0 # 負数に対しては0を返す
  Math.sqrt(x)
end

ただ、上のコードは、例えば次のように書き換えられる。

squareroots = data.collect do |x|
  if (x < 0) then 0 else Math.sqrt(x) end
end

うーん。nextの使い道が難しいw