1194704551 Rubyのすごい機能を教えてください

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:
  • 終了:2007/11/18 08:55:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:ku23ta No.1

回答回数431ベストアンサー獲得回数11

id:garyo

すごいというか・・・これはRubyの基本ですね。

良くまとまっていて読みやすいと思います。

2007/11/11 09:01:21
id:lunlumo No.2

回答回数107ベストアンサー獲得回数14

ポイント23pt

 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...

id:garyo

ありがとうございます。

Mix-inは単一継承と多重継承の問題点を解決(単一継承で、多重継承が必要な場合はMix-inを使用)していてすごいと思います。

特異メソッドはオブジェクトにメソッドを動的につけられるので面白いですね。

http://itpro.nikkeibp.co.jp/article/COLUMN/20070611/274309/?P=2

2007/11/12 20:01:17
id:ugi1010 No.3

回答回数39ベストアンサー獲得回数3

ポイント22pt

レベルの低い話ですみません

私にとって、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...

id:garyo

メモリーが許す限り大きな数字が使えるのは凄いですよね。

フランスの「人間計算機」、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%...

2007/11/17 16:33:39
id:kuro-yo No.4

回答回数171ベストアンサー獲得回数29

ポイント22pt

特異メソッドもさる事ながら、メソッドミッシングを捕捉できるところがいいと思います。未定義のメソッドに対して、動的に未定義なメソッドの振る舞いを定義できます。

またイテレータの取り扱いが大変良くできています。イテレータ(反復子)という名前ですが、ブロックにパラメータを渡すというところに着目して、if文を抽象化して、特定条件化でのみ実行されるブロックを記述する事が、楽に美しくできます。

適当なURLが思い当たりませんので、本家サイトを置いておきます。

http://www.ruby-lang.org/ja/

id:garyo

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関数に比較用の関数を渡すのをもっと簡単で汎用的に扱えるようにしたイメージですね。

2007/11/17 16:17:43
  • id:garyo
    まつもと直伝 プログラミングのオキテ
    http://itpro.nikkeibp.co.jp/article/COLUMN/20060825/246409/?ST=oss
    を読んで改めてRubyはすごいなと思いました。
    リフレクションとかクラスもオブジェクトとして扱えるとか。
    他にもこんなすごい(面白い)機能があるというのを教えてください。
  • id:garyo
    中々回答が集まらないので
    「あなたが思う『Rubyのここが凄い』と思う所を紹介してください」にします。
  • id:hachi2ee
    普通かもしれませんが「全てがオブジェクト」「基本クラスを書き換えられる」「ブロックが使える」は凄いと思います。Smalltalkでは実現されていたのですが、それ以降、何故か実現されてこなかったので、それを実現したrubyは凄いと思います。

    以下のように書けば文字クラスを書き換えられますので、その後は、 "テスト".escape みたいな感じに書くことができます。CGI.escape("テスト") よりも私は分かりやすくて好きです。基本クラスを書き換えるのは邪道だと言われる方もいますが.....

    require 'cgi'
    class String
    def escape
    return CGI.escape(self)
    end
    end
  • id:garyo
    >普通かもしれませんが「全てがオブジェクト」「基本クラスを書き換えられる」「ブロックが使える」は凄いと思います。
    確かに凄いと思います。質問が終わってしまったので、再度いわしにして質問してみました。
    http://q.hatena.ne.jp/1195364865
    色々ここがすごいという所を教えていただけると嬉しいですね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません