2011-09-26 27 views
8

Tôi đang cố gắng để hiểu sự khác biệt giữa *(1..9)[*1..9]splat ruby ​​Hiểu trong phạm vi và mảng

Nếu tôi gán chúng cho các biến họ làm việc cùng một cách

splat1 = *(1..9) # splat1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
splat2 = [*1..9] # splat2 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

Nhưng mọi thứ trở nên kỳ lạ khi tôi hãy thử sử dụng trực tiếp *(1..9)[*1..9].

*(1..9).map{|a| a.to_s} # syntax error, unexpected '\n', expecting tCOLON2 or '[' or '.' 
[*1..9].map{|a| a.to_s} # ["1", "2", "3"...] 

Tôi đoán một phần của vấn đề là với tỷ lệ nhà điều hành? Nhưng tôi không chắc chắn những gì đang xảy ra. Tại sao tôi không thể sử dụng *(1..9) giống như tôi có thể sử dụng [*1..9]?

+1

'p * (1..9) .map {| a | a.to_s} 'hoạt động ok – Bohdan

+0

Tương tự,' ([* 1..9]). map' sẽ hoạt động tốt; tuy nhiên, tôi nghĩ rằng phương pháp 'to_a' rõ ràng là rõ ràng hơn và về cơ bản giống như súc tích. – maerics

Trả lời

8

Tôi tin rằng vấn đề là splat chỉ có thể được sử dụng như một giá trị, đó là nó phải được nhận bởi một cái gì đó.

Vì vậy, ví dụ của bạn về *(1..9).map không thành công vì không có người nhận vào biểu tượng, nhưng [*1..9].map hoạt động vì mảng mà bạn đang tạo là người nhận biểu tượng.

UPDATE: Một số thêm thông tin về chủ đề này (đặc biệt là những nhận xét cuối cùng): Where is it legal to use ruby splat operator?