country =
["UK", "US", "RS", "EU", "UK", "US"].
group_by{ |e| e }.
keep_if{ |_, e | e.length > 1 }
#⇒ {"UK"=>["UK", "UK"], "US"=>["US", "US"]}
第二个块中_
(下划线)的用途是什么。有人可以详细解释吗?
答案 0 :(得分:5)
按照惯例,下划线用作未使用的值的变量名。与其他变量名称不同,它可以在单个并行分配中多次使用。
在这种特殊情况下,块中的过滤器对哈希键不感兴趣,而仅对哈希值感兴趣,哈希值是group_by
生成的数组。
答案 1 :(得分:4)
在两个级别上有三个答案。
第一个答案是在Ruby语言方面:在Ruby中没有使用下划线。没有任何意义就像任何其他合法标识符一样,它只是一个合法标识符。可以将其命名为foo
或bar
,并且不会以任何方式更改此代码的含义。
第二个答案是在Ruby社区级别上:在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社区中的常用用法关闭某些错误和警告。
通常,linter,静态分析器,编辑器和提供Ruby代码语义分析的IDE也应遵守此约定,例如突出显示并警告未使用的变量的IDE不会对名称以_
开头或为!exists($${DESTDIR_WIN_CELLTWEAK}) {
$$quote($${DESTDIR_WIN_CELLTWEAK})
QMAKE_POST_LINK += $$quote(mkdir $${DESTDIR_WIN_CELLTWEAK} $$escape_expand(\n\t))
}
的变量执行此操作。