Smalltalk の #ensure: もリターンを撤回できる

以下のメソッドを呼び出すと何が得られるだろうか?

def foo
  return 1
ensure
  return 2
end
Rubyのensureはreturnを撤回できる - Hello, world! - s21g


Smalltalk だと、これはどんな動きをするのかと疑問に思ったので手元の Smalltalk 処理系(Squeak[link]、Cincom[link]、Dolphin[link]GNU[link])で同じようなこと試してみました。

[^1] ensure: [^2]   "=> 2 "


Rubyと同様にリターン(Smalltalk では「^」)は撤回されるようです。用事を済ませて出て行った人を、首根っこひっつかんで引き戻すみたいでちょっと面白い動きですね。

(ただ、Cincom Smalltalk では #ensure: の引数のブロックにリターンを含むべきではないと警告が出ます。)


流れを読めていませんでした…。orz