2012-08-23 32 views
5

Xin vui lòng ai đó có thể giải thích một đối tượng phạm vi của 2..-1 có nghĩa là gì.Phạm vi 2 ..- 1 có nghĩa là gì? (Ruby koans about_arrays.rb)

của Ruby công án đã điều sau đây trong about_arrays.rb:

def test_slicing_with_ranges 
    array = [:peanut, :butter, :and, :jelly] 

    assert_equal [:peanut, :butter, :and], array[0..2] 
    assert_equal [:peanut, :butter], array[0...2] 
    assert_equal [:and, :jelly], array[2..-1] 
end 

Các trang web sau đây (tìm thấy từ câu trả lời khác) giải thích cách làm việc với dãy cắt: Gary Wright, string/array slices Từ đó, tôi hiểu tại sao chia cho các trả lời nó. Điều tôi không hiểu là phạm vi WHAT phạm vi đối tượng được đề cập đến. Đối với một phạm vi bình thường, tôi có thể làm:

(1..3).each { |x| puts(x) } 

mang đến cho cho kết quả sau khi thực hiện trong IRB:

1 
2 
3 
=> 1..3e 

Tuy nhiên, (2..-1).each { |x| puts(x) } cho:

=> 2..-1 

Vì vậy, những gì hiện phạm vi (2..-1) có nghĩa là gì?

Trả lời

11

Chỉ mục phủ định có nghĩa là "đếm từ cuối mảng". Vì vậy, -1 là mục cuối cùng trong mảng. 2..-1 có nghĩa là từ mục thứ ba đến mục cuối cùng.

+0

Cảm ơn @DragoonWraith. Có lẽ tôi đang suy nghĩ về đối tượng phạm vi không chính xác. Từ câu trả lời của bạn, một phạm vi của nó với một bắt đầu của 2 (mục thứ ba) và kết thúc -1 (mục cuối cùng). Tôi đoán điều gì khiến tôi bối rối là điều này có ý nghĩa gì bên ngoài bối cảnh chia tách: những con số nào là 'giữa' 2 và -1; tại sao không '(2 ..- 1) .each' in bất cứ điều gì? – Will

+0

@Will: Bạn chỉ có ba mục trong mảng của mình, vì vậy không có gì ở giữa '2' và giá trị cuối cùng; '2' * là * cái cuối cùng. Đó là lý do tại sao bạn không nhìn thấy bất cứ điều gì. Nếu bạn thử với một mảng lớn hơn, bạn sẽ thấy mọi thứ. – KRyan

+1

"số nào là 'giữa' 2 và -1" - Không có. "tại sao không (2 ..- 1). in bất cứ điều gì?" - Đó là lý do tại sao ;-) –