Существует три ответа на этот вопрос на двух уровнях.
Первый ответ находится на уровне языка Ruby: подчеркивание в Ruby не используется.Это не имеет смысла.Это просто юридический идентификатор, как и любой другой юридический идентификатор.Вместо этого его можно было бы назвать foo
или bar
, и это никоим образом не изменило бы значение этого кода.
Второй ответ находится на уровне сообщества Ruby: в сообществе Ruby.подчеркивание используется для общения с другими программистами, читающими код: «Мне нужно указать здесь идентификатор, потому что меня заставляют правила языка Ruby, но на самом деле я не заинтересован в нем, я фактически никогда не буду его использовать».Таким образом, это не имеет никакого значения для Ruby, но имеет значение для Ruby программистов .Это как методы, оканчивающиеся на !
или ?
: они не имеют особого значения, они просто используются для передачи намерений от одного программиста на Ruby к другому.
Третий ответ снова на уровнеЯзык Ruby: из-за # 2 в Ruby 1.9+ были внесены два изменения, которые кодифицируют использование подчеркивания как идентификатора «игнорировать меня»:
- Обычно неиспользуемые локальные переменные генерируют предупреждения.Неиспользуемые локальные переменные, которые начинаются с подчеркивания или просто называются
_
, не генерируют предупреждений. - Обычно идентификатор можно использовать только один раз в списке параметров.Идентификаторы, которые начинаются с подчеркивания или просто называются
_
, могут использоваться несколько раз.
См .:
#!/usr/bin/ruby -w
foo = nil
bar = nil
baz = nil
Запуск:
./test.rb
./test.rb:3: warning: assigned but unused variable - foo
./test.rb:4: warning: assigned but unused variable - bar
./test.rb:5: warning: assigned but unused variable - baz
Но:
#!/usr/bin/ruby -w
_foo = nil
_bar = nil
_ = nil
Бег:
./test.rb
И:
#!/usr/bin/ruby -w
def foo(bar, bar) end
Бег:
./test.rb
./test.rb:3: duplicated argument name
def foo(bar, bar); end
[Второй bar
подчеркнуто в консоли, которую здесь трудно воспроизвести.]
Но:
#!/usr/bin/ruby -w
def foo(_bar, _bar) end
Запуск:
./test.rb
Итак, единственное различие междуподчеркивание и отсутствие подчеркивания заключается в том, что подчеркивание отключает определенные ошибки и предупреждения в соответствии с его обычным использованием в сообществе Ruby.
Это соглашение обычно также соблюдается линтерами, статическими анализаторами, редакторами и средами разработки, предоставляющими семантическиеанализ кода Ruby, например, IDE, которые выделяют и предупреждают о неиспользуемых переменных, не будут делать это для переменных, имя которых начинается с или является _
.