代入処理と同時にifを評価

rubyの場合、nilとfalse以外はtrueとなる。
よって、こういう書き方ができる。

  if name
    puts name
  end

この書き方はjavascriptでもできますね。
で、ここまでは知ってたんだけど、こんな書き方も出来るってのは知らなかった。

  ary = ["hello"]

  if name = ary[0]
    puts name
  end

  puts name

  if name = ary[1]
    puts name
  end

このifでは、「name = ary[0]」の結果、つまり代入後のname変数の値が評価対象となるみたい。ary[0]は「hello」なので、ifはtrueとなり「hello」が出力される。
念のためにやってみたけど、その後の「puts name」でも「hello」が表示されたのでスコープはifの中だけということではないようだ。ちなみに次のif文のところ、Javaな人としてはArrayIndexOutOfBoundsExceptionが出るのではと不安がよぎるのですが、rubyでは範囲外にアクセスした時の結果はnilとなります。よって何も出力されません。

追記(2008/7/23)

よくよく考えたらこれ驚くほどのことじゃないか。以下はjavaの例。意味はないけど。
rubyの書き方が簡潔やったのですごい!と勘違いしたのかな。。

String hh = null;
String s = "hello";

if ((hh = s.substring(0, 1)) != null) {
	System.out.println(hh);
}