Rubyはハッシュに数値と文字列のkeyが持てるんですね

Rubyで書かれたコードにbugがあって調べることになり、初めて知りました。

Ruby

% ruby -e 'h = {1 => true, "1" => false}; p h'
{1=>true, "1"=>false}

Perl

% perl -MData::Dumper -e '$h = {1 => true, "1" => false}; warn Dumper $h'
$VAR1 = {
          '1' => 'false'
        };

PHP

% php -r '$h = array(1 => true, "1" => false); var_dump($h);'
array(1) {
  [1]=>
  bool(false)
}

追記

ということで、

  • Object#hash ハッシュの格納に用いられるハッシュ値の計算
  • Object#eql? キーの同一性判定

の2つを定義すれば何でもkeyになるよという話。
ハッシュの特性を考えれば確かにそうですよねそうですよね。