method_missingメソッドのお勉強

Ruby の strict - #生存戦略 、それは - subtech

トラックバックをもらったので早速反応してみる。

僕が言うstrict的なものっていうのは変数に対してのみで、メソッド呼び出しのチェックまでは期待していません。
というかPerlでもメソッド呼び出しをコンパイル時に存在するかどうかチェックはできないですし。

ただ、Rubyはローカル変数とメソッド呼び出しが同じ書き方なのでstrict的なものを実装するにはPerlで言うところのmy宣言ができないと無理だろうなと思いました。

メソッドとして使われそうな場合はコンパイル時にチェックして欲しくないけど、変数として使われる場合にはコンパイル時にチェックして欲しいとかになって、コンパイラからするとどっちでチェックすりゃいいんだよぉー!とかになりそう。

まぁまぁとりあえずstrictの話はこんなもんにしといてトラックバックくれた人(名前がわからなかったorz)のエントリのサンプルコードの実装について勉強してみようと思う。

 class Foo
   def bar
     baz
   end
 
   def method_missing(method)
     puts "method #{method} call"
   end
 end
 
 Foo.new.bar

このmethod_missingというのは下記のドキュメントを読むところ、

プログラミング言語 Ruby リファレンスマニュアル

どうやらPerlでいうところのAUTOLOADみたい。
ということでPerlで同じ処理を書いてみます。

 package Foo;
 use strict;
 
 sub new {
     my $class = shift;
     bless {}, ref $class || $class;
 }
 
 sub bar {
     baz(); # 本来なら$self->baz;と書くべき。
 }
 
 our $AUTOLOAD;
 sub AUTOLOAD {
     my $proto = shift;
     return if $AUTOLOAD =~ /::DESTROY$/;
     my ($class,$method) = $AUTOLOAD =~ /(.+)::(.+)$/;
     print "method $method call";
 }
 
 Foo->new->bar;

うわぁ、同じ処理書いてるだけなのにPerlはごちゃごちゃいっぱい書かないとダメですなぁ・・・。Rubyの方は凄くシンプル。