2012-09-10 39 views
6

Tại sao không phải là [1..5] == [1,2,3,4,5]?Tại sao không phải là [1..5] == [1,2,3,4,5]?

Tại sao không phải là [1..5].to_a == [1,2,3,4,5]?

Làm cách nào để chuyển đổi từ [1..5] sang [1,2,3,4,5]?

+1

'[1..5]' giống với '[(1..5)]' (một mảng chứa một đối tượng Phạm vi). Các 'kiểm tra' không phải là rất hữu ích nếu điều này không được hiểu, nhưng hãy thử' [1..5] [0] 'trên REPL mà nên rõ ràng những thứ lên. –

+4

Mở rộng phạm vi bằng '[* 1..5]' –

Trả lời

18

[1..5] là một mảng mà chỉ có một phần tử, đối tượng phạm vi 1..5

[1..5].to_a vẫn là [1..5]

(1..5).to_a[1,2,3,4,5]

2

[1..5] là một mảng có một phần tử - một đối tượng phạm vi, mọi nỗ lực lặp lại thông qua nó sẽ không thành công. mảng có thể có nhiều loại đối tượng trong đó. Trong ví dụ trên, tôi coi phạm vi đó chỉ là một phạm vi và tạo bất kỳ mảng nào từ nó trực tiếp.

1.9.3-p125 :008 > (1..5).to_a # Note regular parens. 
=> [1, 2, 3, 4, 5] 
1.9.3-p125 :009 > 

Để làm nhiều chặt chẽ những gì bạn nói - bắt đầu với [1..5] - bạn có thể làm:

1.9.3-p125 :013 > newarray = [] 

1.9.3-p125 :014 > [1..5][0].each {|e| newarray << e} 
=> 1..5 
1.9.3-p125 :015 > newarray 
=> [1, 2, 3, 4, 5] 
1.9.3-p125 :016 > 
Các vấn đề liên quan