ruby 块参数中的_是什么意思?

muk1a3rh  于 2023-02-22  发布在  Ruby
关注(0)|答案(2)|浏览(183)

我想知道是否有人能给我解释一下破折号保持器做什么的?

def remove_every_other(arr)
  arr.select.with_index { |_,idx| idx.even? }
end
w8biq8rn

w8biq8rn1#

从某种意义上说,这只是一个和其他参数一样的参数,名为_的参数和名为idx的参数没有区别,它们都是和其他参数一样的参数。
因此,从某种意义上说,_没有什么特别之处:它与其他名称一样,也可以命名为foobarbaz
然而,这并不完全正确:_ * 被Ruby语言 * 特殊对待,更准确地说,* 任何以_ * 开头的局部变量名或参数名都被Ruby语言 * 特殊对待。
在许多社区中,标识符_或以_开头的标识符被用来表示某个东西被"故意忽略"了,这也是Ruby社区中的用法。
为了支持将_用于被忽略的变量或参数,Ruby语言以两种方式特殊对待以_开头的局部变量和参数:

未使用的局部变量警告

Ruby将为未使用的局部变量生成警告:

a = 42
b = 42

b

将生成"警告:已分配但未使用的变量-a "。
但是,如果我将变量重命名为_a_,警告将被隐藏:

_a = 42
_ = 42
b = 42

b

重复参数SyntaxError

在同一个参数列表中(在方法参数列表、块参数列表和lambda文本参数列表中)使用同一个名称两次是SyntaxError
一个一个二个一个一个一个三个一个一个一个一个一个四个一个
_a_有效:

def foo(_a, _a, _, _) end
foo {|_a, _a, _, _|}
-> (_a, _a, _, _) {}

IRb中的最后结果

_还有一个 * 第三个 * 用法,具体是在IRb中,它与上面的用法无关:在IRb中,局部变量_被自动赋以当前IRb会话中最后一个表达式的值,但这纯粹是IRb的一个特性,与Ruby无关。

在短绒机/风格检查机/静态分析仪中处理

许多链接器、样式检查器和静态分析器中的默认规则集禁止使用未使用的参数和局部变量,假设这通常表示输入错误、编程错误或重构遗留代码。与Ruby本身类似,它们通常允许以_开头的变量和参数这样做。
这与Ruby语言本身无关,不过,这是Ruby社区的问题,更准确地说,是那些遵循社区中大多数使用方式的工具的开发人员的问题。

3mpgtkmj

3mpgtkmj2#

在这种情况下,下划线将允许您跳过不需要的元素。
在其他情况下,_等于最后输出。

$ irb
>> 2*3
=> 6
>> _ + 7
=> 13
>> _
=> 13

相关问题