2016-04-04 6 views
0

у меня есть это:В чем разница `{'x' => 3}` и `{x: 3}`?

a = {'x' => 3} 
b = {'x': 3} 
c = {x: 3} 
d = {:x => 3} 
e = {:'x' => 3} 

Итак, у меня есть что b = c = d = e = {:x => 3}, тем временем a = {"x" => 3} но a.class == b.class.

Я не понимаю, в чем разница между a и остальными переменными.

+0

Что такое метод 'class =', используемый в 'a.class = b.class'? – sawa

+0

Извините, я уверен, логическая проверка между объектным классом истинна. –

+1

Возможный дубликат [В Ruby, что такое значение двоеточия после идентификатора в хэше?] (Http://stackoverflow.com/questions/10645668/in-ruby-what-is-the-meaning-of-colon-after -identifier-в-хэш) – texasbruce

ответ

2

В b, c, d и e, ключ является Symbol.

В a ключ String.

a = { 'x' => 3 } #=> { "x" => 3 } 
b = { 'x': 3 } #=> { :x => 3 } 
c = { x: 3 }  #=> { :x => 3 } 
d = { :x => 3 } #=> { :x => 3 } 
e = { :'x' => 3 } #=> { :x => 3 } 
2

Ваша переменная a hash имеет "x" ключ как строку, в то время как другие переменные имеют этот ключ как символ.

Вызов class на объект в Ruby возвращает его класс, в вашем примере это Hash. Другими словами, конструктор всех хэш-экземпляров, например {x: 3}, является объектом Hash.

0

Существует значительная разница между String и Symbol классов рубина:

По соглашению, все, кроме первых хеш-обозначений, поданных ключи к экземпляру Symbol, в то время как первая использует ключ (String экземпляра в данном конкретном случае), как это. (Чтобы быть более точным: b и c литого ключа к экземпляру Symbol, d и e ничего не выкидывали, а ключи, приведенные в этих случаях Symbol экземпляров уже.)

С ('x' == :x) == false, a хэша отличается от latters.

Смежные вопросы