よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

July 28, 2003

[Ruby] warning: multiple values for a block parameter

ruby 1.8.0 (2003-07-28) [i686-linux]にて。

Hash + 配列の場合

h = {:test => [[1,2],[2,3]]}
 
h[:test].each do |v|
  p v
end

結果:

[1, 2]
[2, 3]

Hash + Hashの場合

h = {:test => {1 => 2, 2 => 3}}
 
h[:test].each do |v|
  p v
end

結果:

test4.rb:3: warning: multiple values for a block parameter (2 for 1)
        from test4.rb:3
[1, 2]
test4.rb:3: warning: multiple values for a block parameter (2 for 1)
        from test4.rb:3
[2, 3]

Array#each{|item| ... }とHash#each{|key, val| ... }の違い。

でも、きっとまたハマるんだろうな、これ(^^;)。

ちなみに、以下のように書くとものすごく当たり前に見えるかもしれないけど、実際コーディングしてると頭の中でごちゃまぜになっちゃうかも。

[[1,2],[2,3]].each do |v|
  p v
end
{1 => 2, 2 => 3}.each do |v|
  p v
end

結果:

[1, 2]
[2, 3]
test4.rb:4: warning: multiple values for a block parameter (2 for 1)
        from test4.rb:4
[1, 2]
test4.rb:4: warning: multiple values for a block parameter (2 for 1)
        from test4.rb:4
[2, 3]

[Ruby-GNOME2] gtk/extconf.rb

ruby 1.8.0 (2003-07-28) [i686-linux]に変えたら、変なMakefileができるようになっちゃったな。dependの関係?

うーむ。


July 28, 2007

[Ruby] hash.keys.include?とhash.has_key?

Ruby-GetText-Package-1.10.0で実施したメッセージキャッシュの実装の中に、キャッシュがあるかないかの判定でhash.has_key?(key)と書けば良いところをhash.keys.include?(key)と書いてあるところが2ヶ所あり、これがパフォーマンス(レポートではCPU使用率)にかなり影響を与えているというレポートがあった

もし、同様の問題を抱えている人がいたら、Ruby-GetText-PackageのCVS版を使うか、lib/gettext.rbでkeys.include?と記述しているところをhas_key?と置換してみてほしい。

実際にベンチマークをとってみると相当差がある。毎回配列生成するんだからそりゃそうだよなぁ。なんでkeys.include?なんて書いたんだろ(^^;)。

require 'benchmark'
 
hash = {}
5000.times{|i| hash[i] = "foo#{i}"}
 
Benchmark.bm(20){|x|
  x.report("hash.keys.include?"){ 10000.times{|i|
    hash.keys.include?(i)
  } }
  x.report("hash.has_key?"){ 10000.times{|i|
    hash.has_key?(i)
  } }
}

結果

% ruby test.rb
                          user     system      total        real
hash.keys.include?    5.230000   0.000000   5.230000 (  5.232516)
hash.has_key?         0.000000   0.000000   0.000000 (  0.003292)

そうそう、レポート先では実際にRuby-GetText-Packageを使ってそれなりの規模のサイトを構築・運用してるらしい。実際に使ってくれてるって聞くとやっぱりうれしいよね。


更新 設定