2012-02-17 35 views
7

Tôi nhận ra rằng các dấu ngoặc nhọn cho một băm có thể được bỏ qua nếu nó là phần tử cuối cùng trong một mảng. Ví dụ, các hình thức:Bỏ dấu ngoặc nhọn cho một băm trong mảng

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

dường như giống hệt nhau để:

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

tôi biết loại này thiếu sót có thể cho các đối số của một phương pháp, nhưng đã không lưu ý nó có thể cho một mảng . Sự hiểu biết của tôi về quy tắc này có đúng không? Và, điều này được mô tả ở đâu đó?

+2

Tôi cho rằng theo lý thuyết, '[...]' là một phương thức gọi tới một phương thức trông giống như 'def x (* args)' để hành vi này có ý nghĩa gì đó. Có thể đào lên mã mảng xử lý chữ C để xem nó được xử lý như thế nào trong nội bộ. –

+3

Tôi sẽ không sử dụng nó như là một thực hành mã hóa mặc dù. Tôi thích nhìn thấy các phân định trực quan được cung cấp bởi '{' và '}', và sẽ nói rằng trong một đánh giá mã. Đó là vấn đề bảo trì và dễ đọc. –

+0

@muistooshort Nó hoạt động ngay cả khi nó không phải là một cuộc gọi phương thức. Điều này làm việc cho việc tạo một mảng. – sawa

Trả lời

4

Điều này dường như là một tính năng mới của 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

Lưu ý rằng các trường hợp mảng chỉ chứa băm hoạt động trong 1.8.x: '' 'ruby 1.8.6-p420: 001> x = [: a => 4,: b => 5] => [ {: a => 4,: b => 5}] '' ' –

-1

Tôi nghĩ rằng các dấu ngoặc vuông (và không có dấu ngoặc vuông nào, như bên dưới) được gọi là các chữ băm và ruby ​​chỉ cố gắng vừa với nó như một phần tử mảng.

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

Nhưng không có nhiều quy tắc để nó, tôi nghĩ rằng - bạn không thể làm điều này:

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

Loại được trả về không phải là một Hash, nhưng là một mảng, do đó, nó là một mảng chữ với một Hash Hashal – davetron5000

+0

có, đó là đúng. bạn đã hy vọng cho một hash literal như thế này: 'a: b, c: d'? – farnoy

Các vấn đề liên quan