Hầu hết đều biết _
ý nghĩa đặc biệt của IRB với tư cách là người nắm giữ giá trị hoàn vốn cuối cùng, nhưng đó không phải là điều tôi đang hỏi ở đây.
Thay vào đó, tôi đang hỏi về _
thời điểm được sử dụng làm tên biến trong mã Ruby-cũ thuần túy. Ở đây, nó dường như có một hành vi đặc biệt, giống như một “biến không quan tâm” (à la Prolog ). Dưới đây là một số ví dụ hữu ích minh họa hành vi độc đáo của nó:
lambda { |x, x| 42 } # SyntaxError: duplicated argument name
lambda { |_, _| 42 }.call(4, 2) # => 42
lambda { |_, _| 42 }.call(_, _) # NameError: undefined local variable or method `_'
lambda { |_| _ + 1 }.call(42) # => 43
lambda { |_, _| _ }.call(4, 2) # 1.8.7: => 2
# 1.9.3: => 4
_ = 42
_ * 100 # => 4200
_, _ = 4, 2; _ # => 2
Tất cả những thứ này đều được chạy trực tiếp trong Ruby (có puts
thêm vào) —không phải IRB — để tránh xung đột với chức năng bổ sung của nó.
Tuy nhiên, tất cả đều là kết quả thử nghiệm của riêng tôi, vì tôi không thể tìm thấy bất kỳ tài liệu nào về hành vi này ở bất kỳ đâu (phải thừa nhận rằng nó không phải là thứ dễ tìm kiếm nhất). Cuối cùng, tôi tò mò về cách tất cả những điều này hoạt động bên trong để tôi có thể hiểu rõ hơn chính xác điều gì đặc biệt _
. Vì vậy, tôi yêu cầu tham chiếu đến tài liệu, và tốt nhất là mã nguồn Ruby (và có lẽ là RubySpec ) tiết lộ cách _
hoạt động trong Ruby.
Lưu ý: hầu hết điều này nảy sinh từ cuộc thảo luận này với @Niklas B.
lambda { |_, _| _ }.call(4, 2)
giữa 1,8 và 1,9 sau đó chỉ là một tác dụng phụ không chủ ý? Như trong các trường hợp "bình thường" khi tên biến không thể trùng lặp, thứ tự mà chúng được gán là không quan trọng.