{| _, e | e.length> 1} какая польза от underScore (_) в Ruby? - PullRequest
1 голос
/ 22 марта 2019
country =
  ["UK", "US", "RS", "EU", "UK", "US"].
    group_by{ |e| e }.
    keep_if{ |_, e | e.length > 1 }
#⇒ {"UK"=>["UK", "UK"], "US"=>["US", "US"]}

Какая польза от _ (подчеркивание) во втором блоке.Может кто-нибудь объяснить подробно?

Ответы [ 2 ]

5 голосов
/ 22 марта 2019

По соглашению подчеркивание используется в качестве имени переменной для значения, которое не используется. В отличие от других имен переменных, его можно использовать несколько раз в одном параллельном присваивании.

В этом конкретном случае фильтр в блоке интересуется не ключом хеша, а только значением хеша, которое является массивом, сгенерированным group_by.

4 голосов
/ 23 марта 2019

Существует три ответа на этот вопрос на двух уровнях.

Первый ответ находится на уровне языка Ruby: подчеркивание в Ruby не используется.Это не имеет смысла.Это просто юридический идентификатор, как и любой другой юридический идентификатор.Вместо этого его можно было бы назвать foo или bar, и это никоим образом не изменило бы значение этого кода.

Второй ответ находится на уровне сообщества Ruby: в сообществе Ruby.подчеркивание используется для общения с другими программистами, читающими код: «Мне нужно указать здесь идентификатор, потому что меня заставляют правила языка Ruby, но на самом деле я не заинтересован в нем, я фактически никогда не буду его использовать».Таким образом, это не имеет никакого значения для Ruby, но имеет значение для Ruby программистов .Это как методы, оканчивающиеся на ! или ?: они не имеют особого значения, они просто используются для передачи намерений от одного программиста на Ruby к другому.

Третий ответ снова на уровнеЯзык Ruby: из-за # 2 в Ruby 1.9+ были внесены два изменения, которые кодифицируют использование подчеркивания как идентификатора «игнорировать меня»:

  1. Обычно неиспользуемые локальные переменные генерируют предупреждения.Неиспользуемые локальные переменные, которые начинаются с подчеркивания или просто называются _, не генерируют предупреждений.
  2. Обычно идентификатор можно использовать только один раз в списке параметров.Идентификаторы, которые начинаются с подчеркивания или просто называются _, могут использоваться несколько раз.

См .:

#!/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, которые выделяют и предупреждают о неиспользуемых переменных, не будут делать это для переменных, имя которых начинается с или является _.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...