>& STDOUT

主にソフトウェアに関する日々の標準出力+標準エラー出力

Rubyのメモ

「初めてのRuby」でいろいろ新鮮だったのでメモ。なお、本書は「(他言語をやってるヒト向けの)Ruby入門書」であり、決してプログラミング初心者向けではないことに注意。プログラミング自体はじめての方は「作りながら学ぶ Ruby入門」とかオススメっぽいです。

初めてのRuby

初めてのRuby

作りながら学ぶ Ruby入門

作りながら学ぶ Ruby入門

1 がオブジェクト

Rubyの洗礼というかなんというか。「何でもオブジェクト」っぷりはJavaScriptの上行ってました。

hortensia:~ snsk$ ruby -v
ruby 1.8.7 (2011-12-28 patchlevel 357) [universal-darwin11.0]
hortensia:~ snsk$ irb
>> 1.to_s(10) #引数は基数。この場合、10進数で文字列に変換。
=> "1"

もう少し詳しく書くと整数はFixnum、少数はFloatというオブジェクトにになります。巨大な数はBignumで、どこまでがFixでどこからがBigか、は実行系によって異なるようです。

>> 1.class
=> Fixnum
>> 1.1.class
=> Float
>> 

なお、rubyでは変数がオブジェクトではなく格納されているアドレスへのポインタであるため、インクリメントが利用できないそうです (参考)

> num = 1
=> 1
>> num++
?> p num
SyntaxError: compile error
(irb):22: syntax error, unexpected tIDENTIFIER, expecting kDO or '{' or '(' from (irb):22
>> num+=1
=> 2

制御文 じゃなくて 制御式

if(hoge != 0){/*do something*/} という擬似コードがあったとき、他の多くの言語では hoge != 0 だけが「式」ですが、Rubyではこの手の制御構文が「式」として定義されています。 先ほどの擬似コード例では、 if(hoge != 0){/*do something*/} 全体が「式」です。式なので評価され、時に値を返します。if式においては実行された文の戻り値が if 式の左辺に入ります。よって、下記のような書き方が可能で、わりと一般的なんだそうな。

status = if unitTestResult == "green" then
    "passed"
else
    "failed"
end
p status #=> "passed"

また、rubyでは繰り返し処理にイテレータを使うのが一般的で、each、times、upto、downto、など専用のメソッドが豊富に用意されています。これをブロック付きメソッド呼び出しと一緒に使うことでオブジェクト(のメンバ)に対する繰り返しを表現するようです。ここ初心者詰まりそう。


1から100まで出力する一例は以下のとおり

100.times do |i|
  puts i
end

"||"で囲まれたローカル変数iに対してブロック内の処理を行う。ちなみに、do と end の代わりに { と } を使うこともできますが、基本的には「rubyっぽい」do と end を使い、

  • ブロック付きメソッドがインラインの場合
  • ブロック付きメソッドの戻り値を利用する場合
  • ブロック付きメソッドからメソッドチェーンを利用する場合
  • openが自動的にリソースを開放することを明示するためにブロックを使う場合

に限り波括弧を使う、という使い分けが本書で提示されていました。
特に思想ないのでこれにしようと思います。

nil と false のふたつの擬似変数以外は全て"真"

「0」も「""」も全部 "真"。
「0以外」が全部"真" なCいくつだかの仕様の真逆ですね。これは他言語からのヒト引っかかりそう。

File::open はブロックを渡すと自動的に開放してくれる

おお!便利!と思ったのですが、これだけ覚えてると「ブロックを渡さない場合は明示的にclose呼ぶ必要がある」が抜けそうで怖いです。

=== は Object#== の別名

PHPやJSから来たヒトがよく引っかかるところです。Good partsでは「常に === を使え」って書いてあるし。Rubyの === は型チェックしません。な、なんだってー!とつぶいたところ「ビルトインクラスと比較することで一応型チェック的なことはできるけど、言語の思想自体がダックタイピング推奨っぽい」とレスいただきました。なるほど。