Mix-inと特異メソッド辺りでしょうか。後者の場合は,凄いと言うよりは変わっていると言った方が近いかも知れませんが。
http://www.namaraii.com/rubytips/?%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%A5%AF%A...
ありがとうございます。
Mix-inは単一継承と多重継承の問題点を解決(単一継承で、多重継承が必要な場合はMix-inを使用)していてすごいと思います。
特異メソッドはオブジェクトにメソッドを動的につけられるので面白いですね。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070611/274309/?P=2
レベルの低い話ですみません
私にとって、rubyのすごいところは「大きな整数が扱える」ことです。
個人的な趣味で、n進数をm進数に変換するプログラムを作りたかったとき、
●rubyだとメモリーの許す限り大きな整数を扱えるのですが、
●VBでは出来ない(やろうとすればアルゴリズムを考えないといけない)
●perlだと確か整数の概念がないので作る気がしなかった(間違っていたらすみません)
rubyに出会い、簡単な計算式で94進数位まで変換することが出来ました。
これ以上のn進数は対応するasciiキャラクター(キーボード)がないし、変換の必要もなかったのでここで満足しましたが、2バイトコードをうまく使えばもっと大きなn進数を扱えると思います。
これは私が持っている書籍です。
http://www.amazon.co.jp/Ruby%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9...
メモリーが許す限り大きな数字が使えるのは凄いですよね。
フランスの「人間計算機」、200桁の数字の13乗根の暗算で72.438秒の世界記録
こっちの記事の数字も
p 2397207667966701**13 で200桁の数字も計算できますね。
86332348800352843610126990022313468510477370930755
99215268139034779532309751168717005763648080727141
38332471217057631111085584156234580200185256128528
97226196105357173387251523920946707380414694987101
他の言語であれば数字の種類・大きさによって型をつけたり、多倍長演算のアルゴリズムで拡張したりするわけですが、Rubyだと自動的に通常の数値と多倍長演算を切り替えてくれるわけですよね。
他の言語:プログラマが数値の値によって型やアルゴリズムを考える
Ruby:コンピューターが数値の大きさを見て自動的に最適な内部処理に切り替える
他の言語がコンピューターが楽なようにプログラマが仕事をする(変数の型やオブジェクトの型をコンパイラに教える)のに対して
Rubyの場合はプログラマが楽をするためにコンピューターを働かせている(変数の型はコンピューターが実行時に推論する)のが凄いです。
だからRubyユーザーは「数値が変数の扱える範囲を超えたら多倍長演算を実装して」とかを考えずに
自分の実装したいアルゴリズムだけを考えればいいので楽ですよね。
Rubyはプログラマが楽にプログラムが書けるよう色々裏でやっているんですがそれが自然な書き方で実装してあるのも凄いですよね。
裏(多倍長演算とか)を知ってるプログラマにとってはその気遣いがまた感動を呼んだりします。
配列の長さも好きなだけ使えるのも好きです。
a=[]
a<<オブジェクト #配列にオブジェクトを追加、これを必要な回数行う
a.each{|x| xを処理} #配列から1つづつ取り出して処理
Rubyだとこれだけで済みます。
cで動的な可変長配列やるためのmallocによるメモリの確保とかポインタによるリスト・スタック・キュー表現やメモリの開放とかは何だったんだろうなと思ってしまいます。
配列は必要なだけ使えて要らなくなったらガベージコレクションが適当に廃棄してくれるので凄く楽です。
私のお気に入りの本はこちらです。
「たのしいRuby 第2版 」
http://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby...
「プログラミングRuby 第2版 ライブラリ編 」
http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%...
特異メソッドもさる事ながら、メソッドミッシングを捕捉できるところがいいと思います。未定義のメソッドに対して、動的に未定義なメソッドの振る舞いを定義できます。
またイテレータの取り扱いが大変良くできています。イテレータ(反復子)という名前ですが、ブロックにパラメータを渡すというところに着目して、if文を抽象化して、特定条件化でのみ実行されるブロックを記述する事が、楽に美しくできます。
適当なURLが思い当たりませんので、本家サイトを置いておきます。
method_missingはdelegateライブラリなどで使われているみたいですね。
すごい機能だと思います。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070608/274002/?P=3&...
イテレータは最初は何のことか分かりませんでしたが、今は手放せないですね。
例えば配列Aに対して
a.each{|x| p x}
とやると配列Aの各要素をxに入れて全ての要素について{}内の処理を実行してくれるわけですね。
eachというメソッドの引数が{|x| p x}という処理(ブロック)だと考えればいいのでしょうが、他の言語には見かけない便利ですごい機能ですよね。
Rubyではメソッドの引数に変数やオブジェクト以外に「処理」も渡すことができるんですよね。
cでいうならsort関数に比較用の関数を渡すのをもっと簡単で汎用的に扱えるようにしたイメージですね。
すごいというか・・・これはRubyの基本ですね。
良くまとまっていて読みやすいと思います。