gpt4 book ai didi

ruby - 标记未使用的 block 变量

转载 作者:数据小太阳 更新时间:2023-10-29 06:42:27 26 4
gpt4 key购买 nike

当有 block 或局部变量不被使用时,有时人们用*标记它,有时用_标记。

{[1, 2] => 3, [4, 5] => 6}.each{|(x, *), *| p x}

{[1, 2] => 3, [4, 5] => 6}.each{|(x, _), _| p x}

{[1, 2, 3], [4, 5, 6]}.each{|*, x, *| p x}

{[1, 2, 3], [4, 5, 6]}.each{|_, x, _| p x}

def (x, *), *; p x; end

def (x, _), _; p x; end

def *, x, *; p x; end

def _, x, _; p x; end

它们之间有什么区别,什么时候应该使用哪个?当需要将多个变量标记为未使用时,如上例所示,哪个更好?

最佳答案

A * 表示“所有剩余参数”。 _ 只是另一个变量名,尽管它有点特殊。所以它们是不同的,例如以下内容没有意义:

[[1, 2, 3], [4, 5, 6]].each{|*, x, *| p x}  # Syntax error

确实,Ruby 应该如何知道第一个星号应该得到 0、1 还是 2 个值(反之亦然)?

想用星号忽略参数的情况很少见。例如,如果您只想使用可变数量参数中的最后一个:

[[1], [2, 3], [4, 5, 6]].each{|*, last| p last}  # => prints 1, 3 and 6

Ruby 允许您不给“其余”参数命名,但您可以使用 _:

[[1], [2, 3], [4, 5, 6]].each{|*_, last| p last}  # => prints 1, 3 and 6

通常,参数的数量是已知的,您最好的选择是使用 _:

[[1, 2, 3], [4, 5, 6]].each{|_, mid, _| p mid}  # prints 2 and 5

请注意,您也可以不命名最后一个参数(就像您在使用 * 时所做的那样),尽管它不太明显:

[[1, 2, 3], [4, 5, 6]].each{|_, mid, | p mid}  # prints 2 and 5

现在 _ 指定的变量名,当您不想使用值时使用。它是一个特殊的变量名,原因有二:

  1. 如果你不使用它,Ruby 不会提示(如果警告打开)
  2. Ruby 允许您在参数列表中重复它。

第 1 点的示例:

> ruby -w -e "def foo; x = 42; end; foo"
-e:1: warning: assigned but unused variable - x

> ruby -w -e "def foo; _ = 42; end; foo"
no warning

第 2 点的示例:

[[1, 2, 3], [4, 5, 6]].each{|unused, mid, unused| p mid}
# => SyntaxError: (irb):23: duplicated argument name

[[1, 2, 3], [4, 5, 6]].each{|_, mid, _| p mid}
# => prints 2 and 5

最后,正如@DigitalRoss 指出的那样,_ 将最后的结果保存在 irb

更新:在 Ruby 2.0 中,您可以使用任何以 _ 开头的变量来表示它未被使用。这样变量名可以更明确地说明被忽略的内容:

_scheme, _domain, port, _url = parse_some_url
# ... do something with port

关于ruby - 标记未使用的 block 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8689673/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com