miau's blog?

Ruby 感想

たのしいRuby を読んで、Ruby について思ったことを色々と書いてみます。
一年後くらいに読むと痛いことになってるかもしれないけど、こういうのを残しておくのも悪いことではないでしょう。

ちなみに知らない人もいそうだけど、私が慣れ親しんでる言語は Perl > PHP > JavaScript > C > それ以外 とかそんな感じ。
で、どれも言語マニアと呼ばれるほど精通してるわけではないから、素人意見くらいに思っていただけると助かります。




■スタイル

前項で「Ruby の標準スタイルがよくわかない」みたいなこと書いたけど、それっぽいの発見。

LoveRubyNet Wiki: RubyCodingStyle

だいたい納得したけど、2 タブなのと return 書かないってのは違和感あるなぁ。
HTML とかは構造上仕方ないので 2 タブで表示することもあるけど、プログラム書いててそれほどネストが深くなることってないんだけど。
Ruby は改行できない(こともないけど良しとしない?)言語特性だから、ある程度仕方ないのかな。
あと return 書かないときの問題は Perl ベストプラクティスとかに載ってるわけだけど。Ruby だと問題にならないのかな。

■puts

Perl6 で say 使ったときも思ったけど、puts 楽だわ。"\n" を足さないだけでこれだけ楽になるとは。
(system.out.println とかじゃ全然楽に感じなかったけど・・・これ長すぎるからなぁ。)
逆に printf 書くときに "\n" 書くのが面倒になってきた。putsf みたいのないの?

■.

ついでに、メンバへのアクセスが -> じゃなくて . なのはいいよね。
これも Perl と JavaScript 併用してるときに思ったことだけど。Perl6 で取り入れられるのも納得。

■"#{〜}"

Perl/PHP では変数の前に $ その他をつける。この記法はシェル由来の(たぶん。未確認ですが)文字列中の変数を識別するための記法であって、MVC な時代にはそぐわないと常々思ってた。
でも JavaScript みたいに単純に $ を省略しただけだと、エラーログの出力時なんかにいちいち文字列連結する必要があって面倒くさい。
Ruby みたいに "#{〜}" でダブルクォート内に任意の式を展開できると、この問題も解決できて幸せ。
PHP みたいに半端な対応({$〜} しか展開してくれない)じゃないのがいい。というか PHP は <?php ?> 内に変数書いて出力するパターンが多かったはずなのに、なぜそういう言語設計にしたのかが謎。

■===

=== 演算子の意味合いが JavaScript や PHP と違って、ちょっと違和感あり。
JavaScript や PHP では == 演算子よりもより厳密なチェックを行う(false になるパターンが増える)のに対して、より緩いチェックを行うことになる(true になるパターンが増える)ので。
「型を考慮した比較を行う」という意味では同じなんだけど、感覚的には ~== くらいの表記がちょうどよかった。

■false

false とみなされるのが false と nil だけ(0 や "" は true)なので、気をつけないと。
でもこれだと、

a.sort {|a, b|
a[0] <=> b[0] || a[1] <=> b[1] || a[2] <=> b[2]
}

みたいな書き方ができないような。どう書くんだろ?
もし良い書き方がないんなら、<=> 演算子は 0 じゃなくて false とか返したほうがいいんじゃないかと思う。

■複数の記法

記法が複数用意されてるのがちょっと嫌い。do 〜 end でもよければ { } でもいいとか。そこに選択肢を設ける理由がわからない。
PHP みたい if {} でも書けるし if: endif でも書ける、というならまだわかる。HTML に埋め込んだときは後者のほうが読みやすいので。

■エイリアス

あと、メソッドのエイリアスが多数あるのが鬱陶しい。PHP でもエイリアスってたくさんあって、join() が implode() のエイリアスだったりするんだけど、これで得した例って一度も無い。
該当処理探すのにわざわざ「join|implode」とか正規表現で探さないといけないし、「join と implode って何が違うんですか?」なんて質問には何度も答える羽目になるし。
それが鬱陶しいので、自分の中では「エイリアスは一切使わない」なんてコーディング規約を設けてたりするんだけど、やっぱその辺は言語側でなんとかしてほしい。

■文字コード

文字コードの扱いはちょっと面倒かも。今の Perl だったら「全部 UTF-8 で書いて、何も考えるな」とか言えるけど、Ruby はそうはいかないっぽい。
というか Shift_JIS、EUC-JP、UTF-8 以外の文字コードは扱えないの?(大抵は UTF-8 で事足りるだろうけど)
まあ、その一方でラウンドトリップ問題とか意識しなくてよくなるのは嬉しい。

■その他細かいこと

・Perl/PHP に慣れると、代入演算子でオブジェクトがコピーされないのが違和感あるけど、Perl/PHP のほうが特殊だろうな。慣れよう。

・正規表現の記法が Perl と違って間違えまくりそう。正規表現は左辺に&修飾子の意味合いが違うあたり。

・教える立場からすると、Perl に比べて Ruby はすごく楽かも。
 変数のプレフィックス(名前わすれた)sigil とかコンテキストの説明とかしなくていいので。


(2007-09-05 追記)


a.sort {|a, b|
a[0] <=> b[0] || a[1] <=> b[1] || a[2] <=> b[2]
}

っぽい書き方としては、

a.sort_by {|v| v.values_at(0, 1, 2)}

こう書けばいいのかな。Array の <=> 演算子(メソッド?)は先頭から順に比較してくれるらしいので。
降順とかも対応するには、

a.sort_by {|v| [v[0], -v[1], v[2]]}

みたいな感じ?


(2007-09-11 追記)

やっぱ↑の方法だと文字列の降順とかに対応できない気がする。
どうやるのがスマートなんだろう?
posted at 20:16:43 on 2007-07-16 by miau - Category: Ruby No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

foobar wrote:

typo でしょうか?
x (大抵は UTF-9 で事足りるだろうけど)
o (大抵は UTF-8 で事足りるだろうけど)

あと $@%& などは sigil と呼ぶそうです。
http://d.hatena.ne.jp/yamaz...
2007-07-18 12:05:46

miau wrote:

ご指摘ありがとうございます。
typoとsigilの箇所修正しました。
2007-07-18 18:14:32

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。