Как символы равны друг другу?

Когда я делаю :symbol == :symbol, я понимаю, что это правда. Они одинаковые.

Если это так, как мы можем создать такие массивы:

a = [{:name=>"Michael"},{:name=>"John"}]

person Naughty.Coder    schedule 29.03.2014    source источник
comment
Почему вы считаете, что это не должно быть возможно?   -  person Douglas F Shearer    schedule 30.03.2014
comment
Там нет никакого противоречия. Элементы в a различны, и, кроме того, массивы могут содержать повторяющиеся элементы. Возможно, вы думаете о хэше, и в этом случае ключи должны быть уникальными, и вы действительно не найдете двух вхождений :symbol в наборе ключей.   -  person Jake Romer    schedule 30.03.2014
comment
@DouglasFShearer Меня просто смущает, потому что первое: имя такое же, как второе: имя в другом хэше   -  person Naughty.Coder    schedule 30.03.2014
comment
Ключ тот же, но каждый хеш отличается. Чего вы не увидите, так это двух или более экземпляров одного и того же символа в качестве ключей в хеше: people = {name: 'Joe', name: 'Jane', name: 'Sally'}. Чтобы интуитивно понять, почему это было бы незаконно, подумайте о том, что должен производить people[:name]. Точно так же a[0] и a[1] не представляют такой концептуальной трудности.   -  person Jake Romer    schedule 30.03.2014


Ответы (2)


Посмотрите приведенный ниже код:

a = [{:name=>"Michael"},{:name=>"John"}]
a.map(&:object_id) # => [70992070, 70992050]

Это потому, что a — это массив хэшей, но это два разных хеш-объекта. В Ruby Hash должен иметь ключ uniq. Но 2 разных хэша могут иметь одинаковые именованные символы в качестве ключей.

person Arup Rakshit    schedule 29.03.2014

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

a_key = "hello"
spanish = { a_key => "hola" }
french = { a_key => "bonjour" }
some_array = [spanish, french]

Кроме того, массивы могут содержать повторяющиеся объекты (например, допустимо [1, 2, 1]), но это даже не дубликаты. Два хэша, содержащие один и тот же ключ, все же являются разными объектами.

В таком массиве нет ничего необычного. На самом деле, это нормально, когда хэши в массиве имеют общие ключи, потому что обычно, если вы хотите поместить что-то в массив, это означает, что у них есть что-то общее, что вы можете использовать для работы с ними одинаковым образом.

person Chuck    schedule 29.03.2014