Personal tools
You are here: Home ブログ 井上
« March 2008 »
Su Mo Tu We Th Fr Sa
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
Recent comments
AirOne v5.0.1出てしまいました inoue 2008-10-29
Re:Reversible debugging in GDB morita 2008-10-09
Re:Google Chromeの発表には驚きました inoue 2008-09-15
Re:Google Chromeの発表には驚きました Anonymous User 2008-09-10
Re:Windowsのタスクマネージャの闇 horii 2008-09-09
Re:Google Chromeの発表には驚きました inoue 2008-09-04
Re:Google Chromeの発表には驚きました inoue 2008-09-04
Re:Google Chromeの発表には驚きました inoue 2008-09-04
Re:Google Chromeの発表には驚きました Anonymous User 2008-09-03
Re:Software Design 2008年2月号「Emacsマスターへの道」の原稿を公開 elim 2008-07-25
Re:Rails(ActiveRecord)のJOINのイディオム inoue 2008-06-20
Re:「ピアレビュー」を読みました Anonymous User 2008-05-12
Categories
カテゴリなし
 
Document Actions

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=に関しては、文法規則と被るので限定しなければいけない点が気持ち悪いです。

慣れとは恐ろしいもので、まあ別にいいか、という気分にもなっていますが。

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/ruby-love-and-hate/tbping

Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.