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

标签 ruby

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

第二 block 中的_(下划线)有什么用。谁能详细解释一下?

最佳答案

在两个层面上有三个答案。

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

第二个答案是在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 不会这样做。

关于ruby - {|_, e| e.length>1} underScore ( _ ) 在 Ruby 中有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55305395/

相关文章:

ruby 字符串格式格式化

ruby - 更改 ActiveRecord 中对象的类

ruby-on-rails - 如何从电脑、heroku、github上彻底删除ruby on rails项目

ruby - cygwin 使用什么版本的 ruby​​?

ruby - 按对象属性对 Ruby 中的对象数组进行排序?

ruby - 我怎么知道 BigDecimal 是否解析失败?

ruby - 在 Ruby 中使用链表进行正确的垃圾收集?

ruby-on-rails - 如何从谷歌地图中的详细地址获取特定城市

javascript - Facebook OAuth2 对话框在新选项卡中打开,而不是弹出窗口(Sinatra、Ruby、OAuth2)

ruby-on-rails - rails 表单数据未保存到数据库