Die meisten sind sich dessen bewusst _
ist eine besondere Bedeutung in IRB als Halter für letzten Rückgabewert, aber das ist nicht was ich hier zu fragen.
Stattdessen frage ich nach, _
wann sie als Variablenname in normalem Ruby-Code verwendet werden. Hier scheint es ein besonderes Verhalten zu haben, ähnlich einer „egal Variablen“ (à la Prolog ). Hier sind einige nützliche Beispiele, die das einzigartige Verhalten veranschaulichen:
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
Diese wurden alle direkt in Ruby ausgeführt (mit puts
s hinzugefügt) - nicht IRB -, um Konflikte mit der zusätzlichen Funktionalität zu vermeiden.
Dies ist alles ein Ergebnis meiner eigenen Experimente, da ich nirgendwo eine Dokumentation zu diesem Verhalten finden kann (zugegebenermaßen ist es nicht die einfachste Sache, danach zu suchen). Letztendlich bin ich gespannt, wie das alles intern funktioniert, damit ich besser verstehen kann, woran es besonders ist _
. Daher bitte ich um Verweise auf die Dokumentation und vorzugsweise auf den Ruby-Quellcode (und möglicherweise RubySpec ), die zeigen, wie _
sich Ruby verhält.
Hinweis: Das meiste davon entstand aus dieser Diskussion mit @Niklas B.
lambda { |_, _| _ }.call(4, 2)
zwischen 1,8 und 1,9 dann nur eine unbeabsichtigte Nebenwirkung ist. Wie unter "normalen" Umständen, unter denen der Variablenname nicht dupliziert werden kann, spielt die Reihenfolge, in der sie zugewiesen werden, keine Rolle.