Rubyの好きなところと嫌いなところ
最初、Rubyのブロックを良いとは思いませんでした。他の言語の経験もあるので、概念自体はすぐに分かりました。スコープを考えなければ関数オブジェクト、スコープを考えればクロージャが、引数に見えないシンタックスで引数で渡る仕組みです。良いと思わなかった点は、どうせ関数オブジェクト(クロージャ)作っているなら、作っていることが明示的な方が良いし、引数で渡すなら、引数らしく見える方が良いと思ったためです。JavaScriptやLispのように、記述が明示的な方が良いと思ったのです。
慣れというのは恐ろしいもので、今はRubyで一番好きなところがブロックです。明示的に関数オブジェクトを作っていないように見えることや、引数に見えないことが、これほどの表現力を生むとは予想外でした。railsもまあまあですが、rakeの方が感動しました。
以前なら、プログラミング初心者に、Perl、Python、Rubyは何が違うんですか、と聞かれたら、似たようなものです、シンタックスは違いますが、それはささやかな違いです、と答えていました。シンタックスの違いは、Lispぐらい違えばともかく、Perl、Python、Rubyぐらいの差ならささやかなものだと思っていました。Rubyを知って、考えを改めました。小さなシンタックスの違いが大きな表現力の差を生むからです。
嫌いなところもあります。一番嫌いな部分は、ローカル変数の参照とメソッド呼び出しの区別をするために、コードの上に向かって(ローカル変数の)初期化があるかを探さなければいけない点です。
次のようなコードがある時、barがローカル変数の参照なのかメソッド呼び出しなのかを知るために、引数にbarがあるか(あればbarは引数のbar)、コードXの部分に bar = の行があるかを調べる必要があります。
def foo(引数) ...コードX... p bar end
もう少し具体的に書くと次のようになります(かなり恣意的なコードです)。
#!/usr/bin/ruby class My def initialize @foo = 2 end def foo p 'foo called' @foo end def foo=(n) p 'foo= called' @foo = n end def doit p foo # メソッドfooの呼び出し foo = 0 # ローカル変数fooの初期化 p foo # ローカル変数fooの参照になる self.foo = 1 # メソッドfoo=の呼び出し p self.foo # メソッドfooの呼び出し end end obj = My.new obj.doit
何が一番気にいらないかと言うと、=のついたメソッド(上の例で言えばfoo=)は必ずself付きで呼ばざるを得ない非対称性です。名前が被った時にselfで限定しなければいけない問題(上の例で言えばself.foo)は、JavaでもC++でもあるので気になりませんが、self.foo=に関しては、文法規則と被るので限定しなければいけない点が気持ち悪いです。
慣れとは恐ろしいもので、まあ別にいいか、という気分にもなっていますが。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/ruby-love-and-hate/tbping