Большинство из них знает о _
специальном значении «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 просто непреднамеренным побочным эффектом? Как и в «обычных» обстоятельствах, когда имя переменной не может быть продублировано, порядок, в котором они назначаются, не имеет значения.