Większość zdaje sobie sprawę ze _specjalnego znaczenia IRB jako posiadacza ostatniej zwracanej wartości, ale nie o to tutaj pytam.
Zamiast tego pytam, _kiedy jest używany jako nazwa zmiennej w zwykłym starym-Ruby-kodzie. Tutaj wydaje się, że zachowuje się w specjalny sposób, podobnie jak zmienna „nie przejmuj się” (à la Prolog ). Oto kilka przydatnych przykładów ilustrujących jego wyjątkowe zachowanie:
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
Były one uruchamiane bezpośrednio w Rubim (z putsdodanymi s) - nie w IRB - aby uniknąć konfliktu z jego dodatkową funkcjonalnością.
To wszystko jest jednak wynikiem moich własnych eksperymentów, ponieważ nie mogę nigdzie znaleźć żadnej dokumentacji na temat tego zachowania (co prawda nie jest to najłatwiejsza rzecz do wyszukania). Ostatecznie jestem ciekawy, jak to wszystko działa wewnętrznie, więc mogę lepiej zrozumieć, co jest specjalnego _. Dlatego proszę o odniesienia do dokumentacji i, najlepiej, kodu źródłowego Rubiego (i być może RubySpec ), które pokazują, jak _zachowuje się w Rubim.
Uwaga: większość z tego wynikła z dyskusji z @Niklas B.
lambda { |_, _| _ }.call(4, 2)między 1,8 a 1,9 to tylko niezamierzony efekt uboczny? Podobnie jak w „normalnych” okolicznościach, w których nazwy zmiennej nie można powielić, kolejność, w jakiej są przypisywane, jest nieistotna.