Hatena::Grouprubyist

trotrの日記

 | 

2008-02-06

*1.8と1.9の差を吸収する方法

一度考えてから、答えを見ることにしよう.

こんな風にすればいいのかな?

-使いたいメソッドを持っているかどうか調べる

-なかったら追加する。

**試しにmax_byで

unless [].respond_to? :max_by
  class Array
    def max_by
      map{ |e| [yield(e),e]}.max{ |xs, ys| xs[0] - ys[0]}.last
    end
  end
end

def f(n)
  (1..n).map{ |e| "*"*(5*rand).to_i}
end

require 'pp'
a = (1..10).map{ f(5)}
pp (1 .. a.length).zip(a)  # !> (...) interpreted as grouped expression

pp a.map{ |e| e.max_by{ |x| x.length}}
# >> [[1, ["**", "***", "****", "*", "**"]],
# >>  [2, ["****", "***", "***", "**", "****"]],
# >>  [3, ["****", "*", "*", "***", ""]],
# >>  [4, ["***", "**", "*", "***", "***"]],
# >>  [5, ["****", "**", "**", "", ""]],
# >>  [6, ["**", "**", "**", "", "*"]],
# >>  [7, ["****", "*", "**", "*", ""]],
# >>  [8, ["***", "****", "****", "****", ""]],
# >>  [9, ["****", "****", "**", "*", "*"]],
# >>  [10, ["**", "", "**", "*", ""]]]
# >> ["****", "****", "****", "***", "****", "**", "****", "****", "****", "**"]

でも、これを直接ソースの中に書くとすでに存在することが分かっているメソッドに対しても、メソッドの有無を調べてしまっている。1.9が無駄に遅くなってしまう。

たぶん、実際に使用する時はこんな感じにするんだと思う。

-1.8用(1.9との差を吸収するため)のファイルを作る

-起動時に、rubyversionを調べる。

-1.8なら、1.8用のファイルをrequireする。

こんな感じかな?

unless VERSION.to_f > 1.8
  require 'for_1.8' #1.8用のファイル
end

#...以下スクリプト

でも、これだと1.8.xで新たに追加されたファイルとの差を吸収することができないかも。if文を二個つければいいのか,こんな感じに

ゲスト



トラックバック - http://rubyist.g.hatena.ne.jp/trotr/20080206
 |