From: Shin-ichiro HARA Date: 2002-06-24T13:16:54+09:00 Subject: [ruby-dev:17559] Re: blocks and local variables 原です。 ><...; a,b,..>の形式で宣言された変数(a,b,..)だけが、 >ブロックの外側のローカル変数環境に影響を与える。 >宣言されていないものは、外側に影響を与えない。 おお!逆転の発想ですね。私もこれはかなりイケテルと感じました。 >実際の動作を説明すると、 >宣言された変数については、要するに外側のローカル変数として >処理されるだけなので簡単です。 >宣言されていない変数は、参照しかされていない間はブロックの外側を参照し、 >代入が起こった時点でブロックローカルな変数として作られます。 敢えて欠点をあげると、、、 ブロックパラメータの;の右で宣言されてない x についての x = x + 1 では、左辺の x はブロックローカル変数であることは確定ですが、 右辺の x は外側の x を表すとすると左右不釣り合いだし、現在 のブロックのローカル変数とすると未定義エラーになる。 後、ブロックパラメータが無いとき、すべてをブロックローカルに するために空のリスト <> を宣言しなければいけないのが、ちょっ と不格好かな。 ... もう一つ案を。[ruby-dev:17533] の逆転の := と合わせてこういうの はどうでしょう。 ブロックパラメータが <...> で与えられれば、ローカル変数の 扱いは小迫案と同じ。<...;a,..> という記法は用いず、外部の ローカル変数に代入するには、a := を用いる。 前掲の「欠点」は共有しますが、明示的な宣言を避ける事ができます。