From: Yusuke ENDOH Date: 2007-08-30T22:11:24+09:00 Subject: [ruby-dev:31687] instance variable as formal argument 遠藤と申します。 仮引数にインスタンス変数を書いたら、インタプリタに二回も馬鹿にされる んですが仕様でしょうか。 $ ./ruby -ve 'def initialize(@foo); end;' ruby 1.9.0 (2007-08-30 patchlevel 0) [i686-linux] -e:1: formal argument cannot be an instance variable def initialize(@foo); end; ^ -e:1: formal argument must be local variable def initialize(@foo); end; ^ 以下で一回だけになりました。 Index: parse.y =================================================================== --- parse.y (revision 13320) +++ parse.y (working copy) @@ -4170,10 +4170,12 @@ f_arg_item : f_norm_arg { /*%%%*/ - if (!is_local_id($1)) - yyerror("formal argument must be local variable"); - arg_var($1); - $$ = NEW_ARGS_AUX($1, 1); + if ($1) { + if (!is_local_id($1)) + yyerror("formal argument must be local variable"); + arg_var($1); + $$ = NEW_ARGS_AUX($1, 1); + } /*% %*/ } そもそも仮引数にインスタンス変数を書けないのはなぜでしょうか。 ローカル変数で受けてインスタンス変数に代入するのは、変数名を 3 回も 書かないといけないので、とても冗長です。 def initialize(foo) @foo = foo end 私の場合、自分でクラスを定義したくない理由の一つになっています。 -- Yusuke ENDOH