このご時世、まったく知らないわけにはいかんだろう、というわけで、こっそり Ruby をお勉強。以下かなり初心者まるだしな感想文。(コメント欄でのツッコミに感謝。追記しました。)
勉強と言っても、仕事で案件が重なり、帰ってもすぐ寝てしまうことがずっと続いていたので、リファレンス本を買い込み、通勤時間にぐわー読んで『脳内Rubyコンパイラ』を作り、わかんない点のみ実際に書いて試してみるというインチキ学習法。
疑問点の前に、実際にやってみてかなり強く思ったのは、ほとんど Perl じゃん!(笑)ってことです。実際、end がない Python だろうぐらいに思っていたのですが、むしろ JavaScript っぽい Perl 。
かなりぼく的には Perl 独自だなと思っていた qw() まであるとは知らなかった(%w{ })。あとPerlishといえば良い意味でも悪い意味でも、$ や @ が残っていた(意味は違うが)。後述する { } があることも相まって、Pythonと違い気をつけないとぱっと見ごちゃごちゃしてくる。
ただし、Perlの場合きれいに書くのにはそれなりの知識とコード量が必要だけど、Rubyはシンプルにオブジェクトオブジェクトしていればきれいなコードが書ける気がする。Perlだとno strict 'refs';しないといけないことがきれいに書けるのは大きい。特にMix-in。
当初の疑問なのですが、1.ブレースは何かというと、イテレータが引数として持つことができるブロックであったり、Procというオブジェクト化されたブロックらしい。(ブレースを使わずにdoとendにすることもできる。補足ありがとうございます > gorouさん )
それは、2.タイーホ演算子とも関係してくるんだけど、イテレータが持つことができるブロックの最初にバーで囲った変数を置くと、そこに毎回の値を入れてくれる。
# つまりPerlのこんなのを
while (my $file = $dir->next) {
print "$file\n"
}
# こう書ける。ほほほう。Perlのmapとかがブロック取るのと似てる。
dir.next {|file|
puts file
}
なんでバー | ナノ?というのはあるけど、イテレート処理はけっこう使うので、すべてのイテレータがこの形式でループを持てるというのはマル。ちなみに | | 演算子をなんて呼ぶのかは未だに不明。特に名前はないのかな? → Ans. ゴールポストって呼ばれたことがあるらしい。コメント欄参照: tnx babieさん
3.の日本語処理だけど、Perl の Encode や Unicode::Japanese、Jcode と同じようなことをするのは nkf や kconv モジュールが担当しているらしい。問題なのは Perl の use encoding 'shiftjis'; のような、利用エンコーディングの指定で、Ruby の場合シェルバング行の -K スイッチで指定するらしい。例えば SJISの文字を含む場合シェルバング行でこう #/usr/bin/ruby -Ks 指定する。
でもこれだと、reqireで呼ばれる側のモジュールに書いておいても意味ないというのと、/usr/bin/env ruby した時使えないのでは。ということは、グローバル変数$KCODE を使うのかな? まあ、日本語系は外部ファイルにせよということかな。(補足:$KCODEを使う、でOK)
4.のサーチパスについて。つまりモジュールを好きな場所に置いて、Perlでいうところの use lib 'hoge'; はどうやってやるのか。答え:-Iスイッチで指定(Perlと同じ)、$: 変数にパスをセット。(補足: $:より$LOAD_PATHの方がいいネ)
最後、5.モジュールは充実しているか。→ CPAN に対応するのは RAA という。
のですが、CPANはなかなか良くできていて、それに慣れていたせいか『RAAの歩き方』はよくわからない。特に、リファレンスが簡単に見れないのはよくない。CPANの場合、SYNOPSISで判断することが多い。
個人的な好みの話だけど、クラス名が大文字で初める規定であれば、ファイル名やディレクトリ名も大文字で始めたら見た目的によかったような?
require 'net/smtp'
Net::SMTP.start('smtp.server', 25) {|smtp|
# do something...
}
# より以下の方がかっこよいのでは。細かいけど
require 'Net/Smtp'
Net::SMTP.start('smtp.server', 25) {|smtp|
# do something...
}
# Perlは大文字小文字についてはconventionで決まっている
# use行とモジュール名が合っているとうれしい気がする
use Net::SMTP;
my $smtp = Net::SMTP->new('smtp.server');
たぶんこれはLLDNで話題に上ったuseはなぜないのに発展しそう
とりあえずここまで。
プログラム言語について、ぼくは JavaScript → ASP(VBScript) → PHP → Python → Perl → Java → Ruby という感じで手をつけてきたことになりますが、覚えたてのころはついつい「この言語が世界一だー」とか思ってしまうもんです。最近はだいぶバランスをとって見れるようにはなってきたと思うのですが、やっぱり Perl がお気に入りです。
例えば、PHPとかでウェブを作るのを覚えて、もっといろいろきれいにやりたい、と思った場合は、Rubyに手を出す(か、PHP5の極地を目指すか)のがいいと思います。ただし、ウェブの新しいもの(各種Web Serviceとか)とかウェブ以外の部分とも連携したハックをやっていきたいよということであれば、Perlはまだまだ十分おすすめです。というかRubyの勉強しているうちにCPANのことを書きたくてエントリ起こしたんだけど、いずれ。
日報/小柴/2007-06-11
1130 aoba mail 関係調査。 k-notify に関しては、/home/tolo/.forward から /home/tolo/bin/k-...
解るところだけお答えします。
> ブロックの区切りはブレース使わずにendじゃなかったっけ。サンプルコードで { } をよく見るけど、あれはなんだろ
イテレータでは{}もdo;end、どちらでも使えます。
http://www.ruby-lang.org/ja/man/?cmd=view;name=FAQ%3A%3A%A5%A4%A5%C6%A5%EC%A1%BC%A5%BF
{}はワンライン、do;endは複数行で使われる場合が多いですね。
> 日本語まわりはどうなの(Unicodeとか)
特に問題なく扱えます。
http://www.ruby-lang.org/ja/man/?cmd=view;name=%C1%C8%A4%DF%B9%FE%A4%DF%CA%D1%BF%F4
の$KCODE参照
>requireのサーチパスってどうやって指定するんだろう(perl でいう use lib)
$:もしくは$LOAD_PATHの配列を操作します。
>モジュールは充実しているだろうか
CPANとまではいかずともそこそこ。最近はrubygemsの登場でパッケージ管理も楽になりました。
> gorou さん
ありがとうございます。いつも http://d.hatena.ne.jp/secondlife/ 読んでます。最近会社でも見やすいデザインになりうれしかったりw
Rubyには便利モジュールの育成に参加する余地が十分残っているのかなあ、という意味でも興味あり、です
buttonmaker を教えてくれたお返しに。
goalposts ですかね>タイーホ演算子
下記のエントリまで特に名前は付いていなかったと思います。この呼び方をまつもとさんは気に入ってるようです。
http://redhanded.hobix.com/inspect/blockAndLambda.html
そもそも演算子じゃありませんが。
タイーホ構文?
そうか。operator じゃなくて syntax か。
一度 | i | が格子の中でぽつーんとしている姿に見えるとどうしてもけなげに見えてしまうw
| e, g | とかだと、牢屋の中だけど二人たのしそうだなーとか。
…くだらない話ですみません