2012-02-17 16 views
7

Zdałem sobie sprawę, że nawiasy klamrowe dla skrótu można pominąć, jeśli jest to ostatni element w tablicy. Na przykład, formy:Pominięcie nawiasów klamrowych dla skrótu w tablicy

[1, 2, 3, :a => 'A', :b => 'B'] 
[1, 2, 3, a: 'A', b: 'B'] 

wydają się być identyczne:

[1, 2, 3, {:a => 'A', :b => 'B'}] 
[1, 2, 3, {a: 'A', b: 'B'}] 

Wiedziałem tego rodzaju zaniechania jest możliwe argumenty metody, ale nie zauważył, że jest to możliwe do tablicy . Czy moje zrozumienie tej zasady jest prawidłowe? I czy jest to gdzieś opisane?

+2

Przypuszczam, że teoretycznie '[...]' jest wywołaniem metody do metody, która wygląda jak 'def x (* args)', więc zachowanie ma sens. Może wykopuj literalny kod obsługi C, aby zobaczyć, jak jest on obsługiwany wewnętrznie. –

+3

Nie używałbym tego jednak jako praktyki kodowania. Wolę widzieć wizualne rozgraniczenie dostarczone przez '{' i '}', i powiedziałbym, że w recenzji kodu. Jest to problem dotyczący konserwacji i czytelności. –

+0

@muistooshort Działa, nawet jeśli nie jest wywołaniem metody. Działa to tylko w celu utworzenia tablicy. – sawa

Odpowiedz

4

Byłoby to wydaje się być nowa funkcja 1,9:

$ rvm use 1.8.7 
$ irb 
ruby-1.8.7-p352 :001 > x = [ 1,2,3,:a => 4, :b => 5 ] 
SyntaxError: compile error 
(irb):1: syntax error, unexpected tASSOC, expecting ']' 
x = [ 1,2,3,:a => 4, :b => 5 ] 
       ^
    from (irb):1 
ruby-1.8.7-p352 :002 > exit 
$ rvm use 1.9.3 
$ irb 
ruby-1.9.3-p0 :001 > x = [ 1,2,3,:a => 4, :b => 5 ] 
=> [1, 2, 3, {:a=>4, :b=>5}] 
ruby-1.9.3-p0 :002 > 
+0

Należy zauważyć, że przypadki, w których tablica zawiera tylko skróty, działają w wersjach 1.8.x: '' 'ruby 1.8.6-p420: 001> x = [: a => 4,: b => 5] => [ {: a => 4,: b => 5}] '' ' –

-1

Myślę, że nawiasy (i bez nawiasów, jak poniżej) nazywane są literałami hash i ruby ​​po prostu próbuje dopasować go jako element tablicy.

>> [1, 2, c: 'd', e: 'f'] # ruby 1.9 hash literals 
=> [1, 2, {:c=>"d", :e=>"f"}] 

Ale nie ma więcej reguł do niego, myślę - nie można tego zrobić:

>> [1, 2, c: 'd', e: 'f', 5] # syntax error, unexpected `]` (waiting for => or :) 
+1

Typ, który jest zwracany, nie jest hasłem, ale tablicą, więc jest to literka alfabetu z osadzonym literałem skrótu – davetron5000

+0

tak, to prawda. Czy miałeś nadzieję na dosłowne sformułowanie: 'a: b, c: d'? – farnoy

Powiązane problemy