2011-01-04 48 views

Trả lời

61
li.delete_at(li.index(n) || li.length) 

li[li.length] là ra khỏi phạm vi, vì vậy || li.length xử lý các trường hợp n không có trong danh sách.

irb(main):001:0> li = [1,2,3,1,2,3] 
=> [1, 2, 3, 1, 2, 3] 
irb(main):002:0> li.delete_at(li.index(2) || li.length) 
=> 2 
irb(main):003:0> li.delete_at(li.index(42) || li.length) 
=> nil 
irb(main):004:0> li 
=> [1, 3, 1, 2, 3] 
+0

Cảm ơn bạn. Tôi đã đánh đầu mình cố gắng thể hiện điều này một cách tao nhã. –

+0

Tôi không hiểu '|| li.length' bất cứ ai có thể giải thích – gates

+1

Bất kỳ giá trị nào trong ruby ​​đều có thể được coi là giá trị boolean, chỉ với 'false' và' nil' đánh giá sai. Cú pháp ống đôi là một cách viết tắt thuận tiện. 'a || b' có nghĩa là "a, trừ khi nó là nil, rồi b". – erich2k8

12

Nếu || li.length là để tránh việc gửi nil để li.delete_at (mà sẽ cho kết quả trong một TypeError), sau đó một phiên bản dễ đọc hơn có thể trông như thế này

li.delete_at li.index(42) unless li.index(42).nil?

+6

Bạn có thể muốn lưu trữ 'li.index (42)' trong một biến, để tránh thực hiện tìm kiếm hai lần. Hiệu suất sẽ tốt hơn cho các mảng lớn. – Kelvin

4

Có lẽ nó nên trở thành một phần của stdlib :

class Array 
    def delete_first item 
    delete_at(index(item) || length) 
    end 
end 
Các vấn đề liên quan