まつもと ゆきひろ@トヨタケーラムです.

In message "[ruby-list:380] bug report#3 and request#5"
    on 96/08/06, Keiju ISHITSUKA <keiju / shljapan.co.jp> writes:
|
|けいじゅ@SHLジャパンです. 
|
|またまた, バグ(仕様?)を2件報告します. あと, 幾つかリクエストがあります.
|
|1. 多重代入
|
|バグ(仕様?)です.
|
|*foo = 1, 2, 3
|
|ができません. これは仕様なのでしょうか?

一応(現在の文法にないと言う意味では)仕様です.

 foo = [1,2,3]

ではどうでしょう? 他の機能と衝突しないようですし,あっても良
いのかなあ.
# 次のバージョンでは試験的に追加してみましょう.

|2. Array#append
|
|バグです.

|array1.append(array2)
|
|を実行すると暴走します.

恥ずかしいミスです.おかしいなあ.

|array1 += array2
|
|は正しく動作するのですが, なぜでしょう?

良く似てはいるが別のコードを使っているからです.

|そうそう. += があるのだから, array.append()はもしかしたら必要ないとい
|うことはありませんか?

まあ,ほとんどの場合は同じ動きをするんですけど,

  $x += $y

は$xと$yを結合した新しい配列を作って,それを$xに代入するとい
う意味になります.一方,

  $x.append($y)

は$xが指している配列そのものを書き換えて,$xに$yの要素を追加
するので,同じ配列を共有している場合に動きが違います.あと,
少しだけメモリ効率が良いです.

  $x = $y = [1,2]
  $x += [3,4]
  # $x == [1,2,3,4]
  # $y == [1,2]

  $x = $y = [1,2]
  $x.append([3,4])
  # $x == [1,2,3,4]
  # $y == [1,2,3,4]

|3. print File.stat("/etc")
|
|これはリクエストです.
|
|構造体に関してなのですが, 構造体をprintすると ``struct Stat''としか出
|ません. メンバに関して名前と値ぐらいを簡単にでいいから出してもらえない
|でしょうか?

inspectというメソッドで内容を詳しい文字列表現が得られます.

  print File.stat("/etc").inspect

としてみてください.

|4. fail/rescue
|
|質問です.
|
|例外をエラーの種類によってキャッチしたいと思う時に, 今のrescueの仕様は
|使いづらいのですが...
|
|エラーの種類を判別する方法が, $@, $! しかないですよね? これでは, 実質
|上, 特定のエラーだけをリカバリすることができません.
|
|fail/resqueの使い方のポリシイが分かっていないだけかも知れません. その
|辺りを説明してもらえませんか?

質問じゃないなあ.^^;;

rescueの中で特定のエラーをとらえたい場合

  begin
    ..
  rescue
    if $! ~= /^No such/
      ...
    else
      fail
    end
  end

変数 $! には(本来)エラーを示す文字列が格納されているわけです
から,その文字列を使って分岐します.上の例では例外を1種類だ
け補足していますが,複数の例外を補足するためには case文が便
利でしょう.

rescue節の中で,failを引数無しで呼ぶと現在の例外をそのまま上
に投げますので,ここで捕捉しない例外はそれを使って上に任せれ
ば良いと思います.

failの使い方としては例外を発生させる時には,原則として例外の
種類を示す文字列を引数として渡し,上の例のように例外のチェイ
ンを行いたい時だけ引数無しのfailを用いると良いでしょう.

これでどうでしょう.これではまだ使いにくいということでしたら,
相談に乗ります.
                                まつもと ゆきひろ /:|)