01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
<http://www.chass.utoronto.ca/~cpercy/courses/6362-lee.htm>
・prescriptive には、that は限定用法のみ、which は非限定用法のみ。
・現在の日常の用法では、カンマやポーズがあれば非限定、prescriptive の傾向も残る
(3) I want her to give me back the book that I loaned her a year ago.
(4) Kumar will never return his gold medal, which he believes he won fairly.
ローカル変数スコープ(クラス、モジュー ル、メソッド定義の本体)における小文字で始まる識別子への最初 の代入はそのスコープに属するローカル変数の宣言になります。
ruby では最初の代入が変数宣言となるので、
広いスコープで使われた変数名を、
狭いスコープで別の変数の名前として使うことができない。
なぜなら、2回目の代入は(宣言なしの)単なる代入として処理されるから。
同名の変数を作るのがそもそも混乱のもとになるというのは一理あるので、
この仕様がひどいとはいえない。
「一度使われた名前は別の目的に使うことができない」という原則はそれなりに合理的だ。
しかし、
x = 10 [1,2,3].each { |x| } puts x
1
2
3
3
というように、ブロック引数内での変数さえも同じように振る舞うのはなんか嫌だ。
上記では、
|x|
の x が外の x だとみなされている。
これは合理的ではない。
もし、「xを1,2,3と次々と書き換える」ことを意図するなら
[1,2,3].each { |y| x=y }
と、ほとんど変わらない手間で、より明瞭に書けるからだ。
ruby-1.9 では
このようなブロック内の変数はブロックローカル変数として独立した変数になるようになった。
http://eigenclass.org/hiki/Changes+in+Ruby+1.9#l7
(2008-01-20T22:40:42+0900)
そもそも、ruby-1.8 のローカル変数スコープはメソッドごとにひとつづつしかなかった。
ruby-1.9 ではブロックローカル変数スコープが新設され、
ブロック引数はそのスコープを作ることになった。
……という理解が正しいようだ。
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
最終更新時間: 2009-02-01 00:57
Powered by chalow