まつもと ゆきひろです
In message "[ruby-list:5822] Is ruby not able to treat 'nil' as 1st arugument for method call ?"
on 98/01/08, Nobuyoshi Miyokawa <nmiyo / hic.co.jp> 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);
+ }
}