2005年12月18日

Rubyのタイーホ演算子の本名を誰か教えてください

このご時世、まったく知らないわけにはいかんだろう、というわけで、こっそり Ruby をお勉強。以下かなり初心者まるだしな感想文。(コメント欄でのツッコミに感謝。追記しました。)

勉強と言っても、仕事で案件が重なり、帰ってもすぐ寝てしまうことがずっと続いていたので、リファレンス本を買い込み、通勤時間にぐわー読んで『脳内Rubyコンパイラ』を作り、わかんない点のみ実際に書いて試してみるというインチキ学習法。

はじめに持っていた疑問点は以下のような感じ
First Impression

疑問点の前に、実際にやってみてかなり強く思ったのは、ほとんど 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のことを書きたくてエントリ起こしたんだけど、いずれ。


TrackBack

Comments

コメントをどうぞ


冨田尚樹
Naoki Tomita
loading from twitter
たぶん人気なもの
del.icio.us/scrap
今日のCPANモジュール
とみた広報
Syndicate this site
Syndicate this site
あわせて読みたい なかのひと