A *
có nghĩa là "tất cả các tham số còn lại". An _
chỉ là một tên biến, mặc dù nó là một chút đặc biệt. Vì vậy, chúng khác nhau, ví dụ như sau không có ý nghĩa:
[[1, 2, 3], [4, 5, 6]].each{|*, x, *| p x} # Syntax error
Thật vậy, làm sao Ruby biết sao đầu tiên có được 0, 1 hoặc 2 giá trị (và ngược lại)?
Có rất ít trường hợp bạn muốn sử dụng dấu sao để bỏ qua tham số. Một ví dụ sẽ được nếu bạn chỉ muốn sử dụng cuối cùng của một số biến của tham số:
của Ruby cho phép bạn không đặt tên cho "nghỉ ngơi" của các thông số, nhưng bạn có thể sử dụng _
:
[[1], [2, 3], [4, 5, 6]].each{|*_, last| p last} # => prints 1, 3 and 6
thông thường, số lượng các thông số được biết đến và lựa chọn tốt nhất của bạn là sử dụng một _
:
[[1, 2, 3], [4, 5, 6]].each{|_, mid, _| p mid} # prints 2 and 5
Lưu ý rằng bạn có thể rời khỏi unna paramater cuối cùng med quá (như bạn có thể khi sử dụng một *
), mặc dù nó là ít rõ ràng:
[[1, 2, 3], [4, 5, 6]].each{|_, mid, | p mid} # prints 2 and 5
Bây giờ _
là các định tên biến để sử dụng khi bạn không muốn sử dụng một giá trị. Nó là một tên biến đặc biệt vì hai lý do:
- Ruby sẽ không phàn nàn nếu bạn không sử dụng nó (nếu cảnh báo đang trên)
- Ruby sẽ cho phép bạn lặp lại nó trong danh sách đối số.
Ví dụ về điểm 1:
> ruby -w -e "def foo; x = 42; end; foo"
-e:1: warning: assigned but unused variable - x
> ruby -w -e "def foo; _ = 42; end; foo"
no warning
Ví dụ về điểm 2:
[[1, 2, 3], [4, 5, 6]].each{|unused, mid, unused| p mid}
# => SyntaxError: (irb):23: duplicated argument name
[[1, 2, 3], [4, 5, 6]].each{|_, mid, _| p mid}
# => prints 2 and 5
Cuối cùng, như ghi chú @DigitalRoss, _
giữ kết quả cuối cùng trong irb
Cập nhật: Trong Ruby 2.0, bạn có thể sử dụng bất kỳ biến nào bắt đầu bằng _
để biểu thị nó không được sử dụng. Bằng cách này, tên biến có thể rõ ràng hơn về những gì bị bỏ qua:
_scheme, _domain, port, _url = parse_some_url
# ... do something with port
Cảm ơn câu trả lời chi tiết.Câu trả lời này có tất cả các thông tin mà tôi muốn. – sawa