Как символите се равняват помежду си?

Когато направя :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 Просто ме обърква, тъй като първото :name е същото като второто :name в другия хеш   -  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 е масив от хеш, но те са 2 различни хеш обекта. В 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