2012-02-17 121 views
7

我意識到如果它是數組中的最後一個元素,可以省略散列的大括號。例如,形式:在陣列中忽略大括號的花括號

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

似乎是相同的:

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

我知道這種省略的是可能的方法的參數,但沒有指出可能的是一個數組。我對這條規則的理解是正確的嗎?而且,這是在什麼地方描述的?

+2

我想在理論上,'[[]]'是一個方法調用看起來像'def x(* args)'的方法,所以這種行爲是有道理的。也許挖數組文字處理C代碼,看看它是如何處理內部。 – 2012-02-17 19:59:33

+3

雖然我不會將它用作編碼練習。我更喜歡看到由'{'和'}'提供的視覺分隔,並且會在代碼審查中聲明。這是一個維護和可讀性問題。 – 2012-02-17 20:11:50

+0

@ muistooshort即使它不是方法調用,它也可以工作。這適用於創建一個數組。 – sawa 2012-02-17 20:16:11

回答

4

這似乎是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

請注意,數組僅包含散列的情況在1.8.x中有效: '''ruby 1.8.6-p420:001> x = [:a => 4,:b => 5] => [ {:a => 4,:b => 5}] ''' – 2017-11-22 23:23:24

-1

我認爲括號(和沒有括號,如下所示)被稱爲哈希文字,ruby只是試圖將其作爲一個數組元素。

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

但有沒有更多的規則,我想 - 你不能做到這一點:

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

返回的類型不是散列,而是數組,因此它是一個帶有嵌入式散列字符的數組文字, – davetron5000 2012-03-10 13:15:47

+0

是的,沒錯。你是否希望得到像這樣的哈希文字:'a:b,c:d'? – farnoy 2012-03-10 19:01:17