2010-05-15 12 views
7

Ok, więc byłem porównując pewne rzeczy w moim DSL Ruby. Jeden konstrukt oboje wsparcie jest toNiespójne ukryte hash w Ruby?

x=["key" => "value"] 

Znając różnicę między tablicami i skrótów, to myślę, że jest to nielegalne, ale wynik w Ruby jest

[{"key" => "value"}] 

Dlaczego tak jest? I z tą trochę składnią, dlaczego nie możesz zrobić Dlaczego tablica jest szczególnym przypadkiem dla niejawnie utworzonych skrótów?

Odpowiedz

2

Innym szczególnym przypadkiem jest w wywołaniu funkcji, należy rozważyć:

def f(x) 
    puts "OK: #{x.inspect}" 
end 
f("foo" => "bar") 
=> OK: {"foo"=>"bar"} 

Tak więc w pewnych kontekstach, Hashe może być zbudowany w sposób dorozumiany (poprzez wykrywanie operatora =>?). Przypuszczam, że odpowiedź brzmi, że to było najmniej zaskakujące zachowanie Matza.

+0

wow to bardzo dziwne .. – Earlz

+0

Jest to najbliżej odpowiedź. To tylko część składni. Rozmawialiśmy trochę w #RubyOnRails aby odkryć, że jest to część gramatyki Ruby. – Earlz

0

Powiedziałbym, że tłumacz ustala, że ​​"klucz" => "wartość" jest hash, w ten sam sposób, jak można by się domyślić, że 5 jest liczbą, gdy umieścisz ją w tablicy.
Więc jeśli piszesz:

x = [5] 

Tłumacz nie będzie myśleć, że jest to ciąg znaków i powrót:

x = ["5"] 

Wydaje się, że rubin niejawnie tworzy skrótów w niektórych przypadkach.

+0

tak, ale 'x = (5)' i 'x = ("5")' są poprawne (nawiasy po prostu umieścić w możliwie ujednoznacznienie), więc dlaczego nie 'x = ("klucz"=>" value ")' Dlaczego możesz umieścić to w tablicy, ale nie bezpośrednio w zmiennej? – Earlz

+0

@Earlz - nie można umieścić że prosto do zmiennej, gdyż nie jest jak łańcuch lub numer w ten sposób. Pokazuje powiązanie między 2 elementami w haszowaniu. Wydaje się, że gdy uruchamiasz go w tablicy, to konwertuje go do mieszania, ale podczas próby, aby umieścić go w zmiennej to nie – bennybdbc

2

Dzięki tej pozornej niespójności w niejawny tworzenia skrótu, rubin osiąga spójność w tym zakresie:

func(whatever...) 

zawsze może być podstawiony:

args = [whatever...] 
func(*args) 

można konwertować między listami argumentów i tablic oraz dlatego logiczne jest, że mają tę samą składnię.