A *
означает «все остальные параметры». _
- это просто другое имя переменной, хотя оно немного особенное. Таким образом, они отличаются, например, следующее не имеет смысла:
[[1, 2, 3], [4, 5, 6]].each{|*, x, *| p x} # Syntax error
В самом деле, как рубин должен знать, если первая звезда должна получить 0, 1 или 2 значений (и наоборот)?
Есть очень мало случаев, когда вы хотите использовать звезду для игнорирования параметров. Примером может быть, если вы хотите использовать только последний из переменного числа параметров:
Рубин позволяет не дать название «остальное» параметров, но вы можете использовать _
:
[[1], [2, 3], [4, 5, 6]].each{|*_, last| p last} # => prints 1, 3 and 6
как правило, количество параметров, как известно, и ваш лучший выбор использовать _
:
[[1, 2, 3], [4, 5, 6]].each{|_, mid, _| p mid} # prints 2 and 5
Обратите внимание, что вы можете оставить последний Унны в параметре мед тоже (как вы можете при использовании *
), хотя это менее очевидно:
[[1, 2, 3], [4, 5, 6]].each{|_, mid, | p mid} # prints 2 and 5
Теперь _
является обозначается имя переменной, чтобы использовать, когда вы не хотите использовать значение. Это специальное имя переменной по двум причинам:
- Рубин не будет жаловаться, если вы не используете его (если предупреждения о)
- рубин позволит вам повторить его в списке аргументов.
Пример пункта 1:
> ruby -w -e "def foo; x = 42; end; foo"
-e:1: warning: assigned but unused variable - x
> ruby -w -e "def foo; _ = 42; end; foo"
no warning
Пример пункта 2:
[[1, 2, 3], [4, 5, 6]].each{|unused, mid, unused| p mid}
# => SyntaxError: (irb):23: duplicated argument name
[[1, 2, 3], [4, 5, 6]].each{|_, mid, _| p mid}
# => prints 2 and 5
Наконец, как @DigitalRoss нот, _
держит последний результат в irb
Update: В Ruby 2.0 вы можете использовать любую переменную, начиная с _
означает, что он не используется. Таким образом, имя переменной может быть более явным в отношении того, что игнорируется:
_scheme, _domain, port, _url = parse_some_url
# ... do something with port
Спасибо за подробный ответ.Этот ответ содержит всю информацию, которую я хотел. – sawa