2010-10-16 3 views
15
ruby-1.8.7-p174 > [0,1][2..3] 
=> [] 
ruby-1.8.7-p174 > [0,1][3..4] 
=> nil 

Trong cài đặt 0 chỉ mục trong đó chỉ mục 2, 3 và 4 tất cả nằm ngoài giới hạn của mảng 2 mục, tại sao các giá trị này trả về các giá trị khác nhau?Ruby xử lý phạm vi truy cập mảng như thế nào?

+0

Câu hỏi của bạn có ít tiếng ồn hơn, nhưng rất tiếc: có thể trùng lặp [Cắt mảng trong Ruby: tìm kiếm lời giải thích cho hành vi phi logic (lấy từ Rubykoans.com)] (http://stackoverflow.com/questions/3568222/array- cắt-trong-ruby-tìm-cho-giải thích-cho-illogical-hành vi-lấy-fr). Trong cả hai trường hợp, sự ngạc nhiên là như nhau: nil vs [] ở chỉ mục kết thúc. –

+0

Ồ, trùng lặp bị từ chối. Tại sao? –

Trả lời

26

Đây là góc kỳ lạ xấu xí đã biết. Hãy xem các ví dụ trong rdoc cho Array#slice.

vấn đề cụ thể này được liệt kê như là một "trường hợp đặc biệt"

a = [ "a", "b", "c", "d", "e" ] 
    a[2] + a[0] + a[1] #=> "cab" 
    a[6]     #=> nil 
    a[1, 2]    #=> [ "b", "c" ] 
    a[1..3]    #=> [ "b", "c", "d" ] 
    a[4..7]    #=> [ "e" ] 
    a[6..10]    #=> nil 
    a[-3, 3]    #=> [ "c", "d", "e" ] 
    # special cases 
    a[5]     #=> nil 
    a[5, 1]    #=> [] 
    a[5..10]    #=> [] 

Nếu bắt đầu là chính xác một mục ngoài cuối mảng, sau đó nó sẽ trở lại [], một mảng trống. Nếu bắt đầu vượt quá điều đó, nil. Đó là tài liệu, mặc dù tôi không chắc chắn về lý do cho nó.