From: matz@... (Yukihiro Matsumoto) Date: 1998-01-08T11:28:33+09:00 Subject: [ruby-list:5823] Re: Is ruby not able to treat 'nil' as 1st arugument for method call ? まつもと ゆきひろです In message "[ruby-list:5822] Is ruby not able to treat 'nil' as 1st arugument for method call ?" on 98/01/08, Nobuyoshi Miyokawa writes: | 最近、ruby の便利さに感動している三代川と申します。 どーも. | ruby では、メソッドの第一引数へ nil を渡す事は、文法上禁じ |られているのでしょうか? いいえ. | 以下のソースを試してみますと、 |1) Foo.bracket=(nil, 'foo') 行を有効にすると、parse エラーに | なる。 bracket=のような=で終るメソッドは foo.bracket=val のような形式でしか呼び出せません.ですから,そのようなメソッ ドを1引数以外で定義できますが,呼び出せません(sendとか以外で は). |2) Foo.new[nil]='foo' 行を有効にすると、[]= メソッドの第一引 | 数へ nil が渡る。 これは望ましい動きですよね. |3) Foo.new[]='foo' 行を有効にすると ruby が core dump する (^^; バグです.一応パッチをつけておきます. | ちなみに、本当にしたかった事は、 | | Hash[] の key が指定されなかった場合には、val 内の一定メ | ソッドを用いて key を自動計算する | |という事なのでした。 def []=(key, val=nil) unless key key = some_method end @hash[key] = val end なんてのはどうでしょう? まつもと ゆきひろ /:|) --- parse.y~ Tue Jan 6 01:40:14 1998 +++ parse.y Thu Jan 8 11:19:11 1998 @@ -3299,7 +3299,9 @@ value_expr(val); - if (nd_type(idx) == NODE_ARRAY) { - idx = list_append(idx, val); - } - else { - idx = arg_add(idx, val); + if (idx) { + if (nd_type(idx) == NODE_ARRAY) { + idx = list_append(idx, val); + } + else { + idx = arg_add(idx, val); + } }