Personal tools
You are here: Home ブログ 井上 Rubyの好きなところと嫌いなところ
« December 2010 »
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 entries
Apache2.4のリリース予定は来年(2011年)初め(あくまで予定) inoue 2010-12-23
Herokuの発音 inoue 2010-12-20
雑誌記事「ソフトウェア・テストPRESS Vol.9」の原稿公開 inoue 2010-12-18
IPA未踏のニュース inoue 2010-12-15
労基法とチキンゲーム inoue 2010-12-06
フロントエンドエンジニア inoue 2010-12-03
ASCII.technologies誌にMapReduceの記事を書きました inoue 2010-11-25
技術評論社パーフェクトシリーズ絶賛発売中 inoue 2010-11-24
雑誌連載「Emacsのトラノマキ」の原稿(part8)公開 inoue 2010-11-22
RESTの当惑 inoue 2010-11-22
「プログラマのためのUXチートシート」を作りました inoue 2010-11-19
「ビューティフルコード」を読みました inoue 2010-11-16
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
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


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