2011年10月10日

[ruby-list:48460] Re: 1.8.7と1.9.2の挙動の違いについて

> # 再帰は私も使います。
> #「はやく動く」プログラムよりも、はやく「動くブログラム」が欲しいとき
> # 再帰で書くのが楽何て事はよくあります。
>
> 出沢@相変わらず日本語が駄目、、、、、

最近の関数型プログラミングの本ならどれにもあると思うのですが、
(実のところ内部で再帰を使うのであっても)陽に自分の手で直接再帰を

書くのではなく、mapとかのような高階関数を使うほうがスマート、という
のもありますね。

> ああ、そういうことだったんですね。
> > 回答するに当たって言語は問わないとの事だったので
> > 多分Rubyでしか使えないロジックよりも一般解に導くように
> > 教えるのが良いだろうと判断して彼と議論してました。

たとえば「 [1, 2, 3] という配列があって、その配列と + という
演算子から、1 + 2 + 3 を計算する」というような発想は、なにも
「多分Rubyでしか使えないロジック」ではありません。ごく一般的な
ものです。Python でも reduce(lambda a, b: a + b, [1, 2, 3]) の
ように、普通にできるものです。

ですがここで、一般解とはなんでしょうか?

たとえば、PHPでもできること、できるやりかた、それだけに縛って
Rubyを使うのなら、Rubyを使う意味は全くありません。PHPを使えば
よいのです。

何のためにRubyを使うor勉強しているのでしょうか?

あと「プログラム1」についてですが、プログラミングの入門を終えた
なら、基礎を固めるトレーニングとして、atoi (というC言語の関数が
あります) とかその逆などのような操作を、
・単純に
・短く
・速く
・移植性を高く
といったことに注意して(両立することもあればトレードオフのことも
あります)書く、といったことをしますが、そういったことをやって
いれば、もうほとんど考えるまでもなく反射的に出てくるコードかと
思います

> str[0], str.slice(0)
> です。これを私は最初の「文字」を抽出してくれるものと思い
> 実際1.9.2では最初の文字を抽出してくれるのですが
> 1.8.7では最初の「バイト」を得るそうです。

これは 1.8 と 1.9 の変更点にたまたまひっかかってしまったもので
それはしょうがないですが、

> str[0, 1], str.slice(0, 1)
> にすれば、互換性が保たれます。
> 引数によって戻り値が文字だったり数値だったりするのが予想外でした。
> 個人的にはあまり良い事だとは思えませんが・・・

引数の数が違えばメソッドのふるまいが違う、などといったことは
オブジェクト指向ではよくあることです。なにか違う所があるなら、
それは違う動作をするはず、というのが普通の予想だと思います。

また [n, m] のふるまいについては、String だけでなく、Array でも
同じように働くものですから、むしろ予想できるものです。

irb> foo = [1, 2, 3, 4]
#=> [1, 2, 3, 4]
irb> foo[1, 2]
#=> [2, 3]

rubyの場合、うっかりした時にコンパイル時の静的なエラーにならない
というのは難点ですが……

また、1.8以前のふるまいは、C言語などの、文字列strに対して
int c = str[3]などのようにしてその文字を整数値として取り出す、
というイディオムがそのまま使える、という利点があり、決して
全く予想外のものではありません。1.9でのm17nにより、やむをえず
変更されたものです。


投稿者 xml-rpc : 2011年10月10日 16:22
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/106847
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。