Ruby言語やLinuxのネタが多いです。
July 28, 2003
■ 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を使ってそれなりの規模のサイトを構築・運用してるらしい。実際に使ってくれてるって聞くとやっぱりうれしいよね。
