Більшість з них знає про _
спеціальному значенні «S в IRB в якості власника для останнього значення, що повертається, але це НЕ то , що я питаю тут.
Натомість я запитую про те, _
коли використовується як ім’я змінної в простому-старому-Ruby-коді. Тут він, мабуть, має особливу поведінку, схожу на “змінну, яка не хвилює” (à la Prolog ). Ось кілька корисних прикладів, що ілюструють його унікальну поведінку:
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
Усі вони запускались у Ruby безпосередньо (з puts
доданими s), а не IRB, щоб уникнути конфлікту з його додатковою функціональністю.
Це все результат мого власного експерименту, оскільки я ніде не можу знайти жодної документації щодо цієї поведінки (правда, це не найпростіша річ для пошуку). Зрештою, мені цікаво, як все це працює внутрішньо, щоб я міг краще зрозуміти, в чому особливість _
. Тому я прошу посилання на документацію та, бажано, вихідний код Ruby (і, можливо, RubySpec ), який розкриває, як _
поводиться Ruby.
Примітка: більша частина цього виникла в результаті дискусії з @Niklas B.
lambda { |_, _| _ }.call(4, 2)
між 1,8 і 1,9 - це просто ненавмисний побічний ефект? Як і в "звичайних" обставинах, коли ім'я змінної не може бути продубльовано, порядок, у якому вони призначені, є несуттєвим.