松崎と申します。

ruby 1.8.2 を使っております。

タブ区切りテキストで与えられるデータを解釈しようとしているのですが、
フィールドの数が不定の場合、

例:
    array = line.chomp.split("\t")
    float = array.shift.to_f
    int   = array.shift.to_i
    str   = array.shift.sub(/^XX/, '')
    :
    :

このような処理をさせると当然、
対応するフィールドがない場合 float に 0.0 や int に 0 が代入され、
str なら例外で落ちてしまいます。
しかし array.shift をいちいち代入して条件分岐させると
フィールド数が多い時に見づらくなってしまいます。

ないフィールドには nil が代入されるための綺麗な解決法はないでしょうか?

自分で思いついたのは、

class Object
  def nonnil
    self && yield(self)
  end
end

としておいて、

    str = array.shift.nonnil{|x| x.sub(/^XX/, '')}

などのようにすることなのですが、
もっとシンプルに書く方法はないでしょうか?

逐一

  def nil_or_sub(*p)
    self && self.sub(*p)
  end

などとすれば

    str = array.shift.nil_or_sub(/^XX/, '')

と書けますが、毎回定義するのも煩雑です。

    str = array.shift.nonnil?.sub(/^XX/, '')

のように書けたら嬉しいのですが、これは多分文法上不可能なんですよね?


お知恵を貸して頂ければ幸いです。

-- 
Motomichi Matsuzaki, PhD <mzaki / biol.s.u-tokyo.ac.jp>
Dept. of Biological Sciences, Grad. School of Science, Univ. of Tokyo, Japan