我想知道是否有人能给我解释一下破折号保持器做什么的?
def remove_every_other(arr) arr.select.with_index { |_,idx| idx.even? } end
w8biq8rn1#
从某种意义上说,这只是一个和其他参数一样的参数,名为_的参数和名为idx的参数没有区别,它们都是和其他参数一样的参数。因此,从某种意义上说,_没有什么特别之处:它与其他名称一样,也可以命名为foo、bar或baz。然而,这并不完全正确:_ * 被Ruby语言 * 特殊对待,更准确地说,* 任何以_ * 开头的局部变量名或参数名都被Ruby语言 * 特殊对待。在许多社区中,标识符_或以_开头的标识符被用来表示某个东西被"故意忽略"了,这也是Ruby社区中的用法。为了支持将_用于被忽略的变量或参数,Ruby语言以两种方式特殊对待以_开头的局部变量和参数:
_
idx
foo
bar
baz
Ruby将为未使用的局部变量生成警告:
a = 42 b = 42 b
将生成"警告:已分配但未使用的变量-a "。但是,如果我将变量重命名为_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的一个特性,与Ruby无关。
许多链接器、样式检查器和静态分析器中的默认规则集禁止使用未使用的参数和局部变量,假设这通常表示输入错误、编程错误或重构遗留代码。与Ruby本身类似,它们通常允许以_开头的变量和参数这样做。这与Ruby语言本身无关,不过,这是Ruby社区的问题,更准确地说,是那些遵循社区中大多数使用方式的工具的开发人员的问题。
3mpgtkmj2#
在这种情况下,下划线将允许您跳过不需要的元素。在其他情况下,_等于最后输出。
$ irb >> 2*3 => 6 >> _ + 7 => 13 >> _ => 13
2条答案
按热度按时间w8biq8rn1#
从某种意义上说,这只是一个和其他参数一样的参数,名为
_
的参数和名为idx
的参数没有区别,它们都是和其他参数一样的参数。因此,从某种意义上说,
_
没有什么特别之处:它与其他名称一样,也可以命名为foo
、bar
或baz
。然而,这并不完全正确:
_
* 被Ruby语言 * 特殊对待,更准确地说,* 任何以_
* 开头的局部变量名或参数名都被Ruby语言 * 特殊对待。在许多社区中,标识符
_
或以_
开头的标识符被用来表示某个东西被"故意忽略"了,这也是Ruby社区中的用法。为了支持将
_
用于被忽略的变量或参数,Ruby语言以两种方式特殊对待以_
开头的局部变量和参数:未使用的局部变量警告
Ruby将为未使用的局部变量生成警告:
将生成"警告:已分配但未使用的变量-a "。
但是,如果我将变量重命名为
_a
或_
,警告将被隐藏:重复参数
SyntaxError
在同一个参数列表中(在方法参数列表、块参数列表和lambda文本参数列表中)使用同一个名称两次是
SyntaxError
:一个一个二个一个一个一个三个一个一个一个一个一个四个一个
但
_a
或_
有效:IRb中的最后结果
_
还有一个 * 第三个 * 用法,具体是在IRb中,它与上面的用法无关:在IRb中,局部变量_
被自动赋以当前IRb会话中最后一个表达式的值,但这纯粹是IRb的一个特性,与Ruby无关。在短绒机/风格检查机/静态分析仪中处理
许多链接器、样式检查器和静态分析器中的默认规则集禁止使用未使用的参数和局部变量,假设这通常表示输入错误、编程错误或重构遗留代码。与Ruby本身类似,它们通常允许以
_
开头的变量和参数这样做。这与Ruby语言本身无关,不过,这是Ruby社区的问题,更准确地说,是那些遵循社区中大多数使用方式的工具的开发人员的问题。
3mpgtkmj2#
在这种情况下,下划线将允许您跳过不需要的元素。
在其他情况下,_等于最后输出。