Hầu hết nhận thức được _
’s special meaning in IRB as a holder for last return value, nhưng đó là không phải những gì tôi hỏi ở đây.Biến _ (gạch dưới) ở đâu và như thế nào được chỉ định?
Thay vào đó, tôi hỏi về _
khi được sử dụng làm tên biến trong mã Ruby cũ. Ở đây nó dường như có 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ụ minh họa hữu ích 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
Đây là tất cả chạy trong Ruby trực tiếp (với puts
s thêm vào) -không IRB-để tránh xung đột với chức năng bổ sung của nó.
Đây là kết quả của thử nghiệm của riêng tôi mặc dù, 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 (thừa nhận đây không phải là điều dễ dàng nhất để tìm kiếm). Cuối cùng, tôi tò mò làm thế nào tất cả điều này hoạt động nội bộ vì vậy tôi có thể hiểu rõ hơn những gì là đặc biệt về _
. Vì vậy, tôi yêu cầu tài liệu tham khảo tài liệu, và tốt nhất là mã nguồn Ruby (và có lẽ là RubySpec) cho biết cách hoạt động của Ruby trong _
.
Lưu ý: hầu hết những điều này phát sinh trong this discussion với @Niklas B.
Tôi tự hỏi liệu sự khác biệt về hành vi của 'lambda {| _, _ | _} .call (4, 2) 'giữa 1.8 & 1.9 chỉ là một tác dụng phụ không chủ ý sau đó? Trong các trường hợp "bình thường", trong đó tên biến không thể được nhân đôi thứ tự mà chúng được chỉ định là không quan trọng. –
Wow, bạn đánh tôi với nó. +1 –
@AndrewMarshall: Vâng, tôi nghĩ rằng vấn đề "4 vs 2" chỉ là một tạo phẩm về cách 1,8 và 1,9 xử lý ngăn xếp. Thời gian duy nhất nó sẽ là đáng chú ý là '| _, _, ... |' bởi vì lỗi trùng lặp đã bị loại bỏ. –