На что соотносятся значения? - PullRequest
0 голосов
/ 04 января 2012

Я не понимаю, как работают хэши в Ruby.

Я ожидаю:

a = 'a'
{a => 1}[a] # => 1
{a: 1}[:a] # => 1
{2 => 1}[2] # => 1

Как это работает?

{'a' => 1}['a'] # => 1

Первая строка 'a' это не тот же объект, что и вторая строка 'a'.

Ответы [ 3 ]

3 голосов
/ 04 января 2012

Ruby не использует объектное равенство (equal?) для сравнения хеш-ключей.Было бы не очень полезно, если бы это все-таки было.

Вместо этого используется eql?, что для строк такое же, как ==

3 голосов
/ 04 января 2012

В качестве сноски к другим ответам вы можете позволить хешу вести себя так, как вы ожидали:

h = {'a'=> 1}
p h['a'] #=> 1
h.compare_by_identity
p h['a'] #=> nil ; not the same object
1 голос
/ 04 января 2012
some_hash[k] = v

Обычно, когда вы делаете это, то сохраняется , а не прямая ассоциация k => v.Вместо этого у k запрашивается хеш-код , который затем используется для сопоставления с v.

Равные значения дают равные хеш-кодыВот почему ваш последний пример работает так, как он работает.

Несколько примеров:

1.9.3p0 :001 > s = 'string'
 => "string" 
1.9.3p0 :002 > 'string'.hash 
 => -895223107629439507 
1.9.3p0 :003 > 'string'.hash == s.hash
 => true 
1.9.3p0 :004 > 2.hash
 => 2271355725836199018 
1.9.3p0 :005 > nil.hash
 => 2199521878082658865
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...