{| _,e | e.length> 1}在Ruby中underScore(_)有什么用?

时间:2019-03-22 17:59:06

标签: ruby

country =
  ["UK", "US", "RS", "EU", "UK", "US"].
    group_by{ |e| e }.
    keep_if{ |_, e | e.length > 1 }
#⇒ {"UK"=>["UK", "UK"], "US"=>["US", "US"]}

第二个块中_(下划线)的用途是什么。有人可以详细解释吗?

2 个答案:

答案 0 :(得分:5)

按照惯例,下划线用作未使用的值的变量名。与其他变量名称不同,它可以在单个并行分配中多次使用。

在这种特殊情况下,块中的过滤器对哈希键不感兴趣,而仅对哈希值感兴趣,哈希值是group_by生成的数组。

答案 1 :(得分:4)

在两个级别上有三个答案。

第一个答案是在Ruby语言方面:在Ruby中没有使用下划线。没有任何意义就像任何其他合法标识符一样,它只是一个合法标识符。可以将其命名为foobar,并且不会以任何方式更改此代码的含义。

第二个答案是在Ruby社区级别上:在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社区中的常用用法关闭某些错误和警告。

通常,linter,静态分析器,编辑器和提供Ruby代码语义分析的IDE也应遵守此约定,例如突出显示并警告未使用的变量的IDE不会对名称以_开头或为!exists($${DESTDIR_WIN_CELLTWEAK}) { $$quote($${DESTDIR_WIN_CELLTWEAK}) QMAKE_POST_LINK += $$quote(mkdir $${DESTDIR_WIN_CELLTWEAK} $$escape_expand(\n\t)) } 的变量执行此操作。