如何使用 ruby​​ 的多重赋值为 void 变量赋值?

Posted

技术标签:

【中文标题】如何使用 ruby​​ 的多重赋值为 void 变量赋值?【英文标题】:How can I assign a value to a void variable using ruby’s multiple assignment? 【发布时间】:2017-02-19 14:44:17 【问题描述】:

我想使用多重赋值,但我不关心我输入的部分值。那么有没有办法将某些东西分配给 void 变量(又名来自 bash 的 /dev/null)?类似nil = 'I wont be used'。我在下面有一个更具体的例子来说明我想要实现的目标。

我的输入是:

['no','foo','nop','not at all','bar']

我是这样分配的:

i,foo,dont,care,bar = ['no','foo','nop','not at all','bar']
#or with a splat :
dont,foo,*care,bar = ['no','foo','nop','not at all','bar']

我想做的是这样的:

nil,foo,*nil,bar = ['no','foo','nop','not at all','bar']

【问题讨论】:

一种常见的替代方法是使用 _ 作为占位符变量。 【参考方案1】:
_, foo, *_, bar = ['no','foo','nop','not at all','bar']
foo #=> "foo"
bar #=> "bar"
_ #=> ["nop", "not at all"]

您也可以将 *_ 替换为 *

是的,_ 是一个完全有效的局部变量。

当然,您不必将_ 用于您不会使用的值。例如,你可以写

cat, foo, *dog, bar = ['no','foo','nop','not at all','bar']

使用_ 可能会减少出错的机会,但主要是为了告诉读者您不会使用该值。有些人更喜欢使用以下划线开头的变量名称来表示不会使用的值:

_key, value = [1, 2]

如果分配的变量少于数组的元素,则丢弃数组末尾的元素。例如,

a, b = [1, 2, 3]
a #=> 1
b #=> 2

【讨论】:

我的建议是尝试不同的表达方式,看看你会得到什么。基本规则是,如果可以得出结论,变量只有一次赋值,那就没问题了。 *a, b, *c = [1,2,3,4,5] 是分配不明确的示例,导致 Ruby 引发异常。 如果我写 _ 或者即使我写 _some_random_name,我的 linter 会删除 unused variable 标志,是否有关于它的约定? @UlysseBN,我不关注“linter”,但是,是的,有些人写 _unused_key。我编辑了我的答案以提及这一点。谢谢。 通过 linter 提供一些语法分析工具 (here is the one I use for ruby) "Where and how is the _ (underscore) variable specified?":从 Ruby 2.0 开始,以下划线开头的变量具有特殊处理,可以防止某些与“我不关心这个值”语义一致的警告和错误(在此之前,只有 @987654336 @ 本身做到了)。例如def x(a, a, c)无效,但def x(_, _, c)有效; def x(_a, _a, c) 自 2.0 AFAIK 起有效。这不仅仅是 linter 的意见,linter 实际上是遵循 Ruby 的规则。【参考方案2】:

您还可以使用values_at 从数组中提取某些元素:

ary = ['no','foo','nop','not at all','bar']

foo, bar = ary.values_at(1, -1)

foo #=> "foo"
bar #=> "bar"

除了索引,它还接受范围:

ary.values_at(0, 2..3) #=> ["no", "nop", "not at all"]

【讨论】:

以上是关于如何使用 ruby​​ 的多重赋值为 void 变量赋值?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 如何在语义上处理赋值?

cs50 多重气味测试。如何开发这个 void print_winner(void) 函数的最佳实践是啥

对象变量和常量

如何在 MATLAB 中进行多重赋值?

将 C++ 转换为 Python(For 循环多重赋值)

ruby 使用名称和新模式索引更新多重可视化