0

在 Ruby 中,我一直在寻找一个优雅的单行语句来为多个变量(但不是全部)分配一个通过方法调用从数组返回的公共值。

目标的关键是转换两行语句,例如:

a, x = 1, 2
y = x

进入:a, x, y = 1, 2, 2 无需对重复值进行硬编码。因此a得到一个值 (1),xy两者共享一个共同值 (2)。

要将示例扩展为用例,假设我们不是直接分配 values 1, 2,而是通过从方法调用返回的数组分配我们的值:

a, x = 7.divmod 5  # array [1,2] is unpacked via parallel assignment
y = x

这与第一个代码示例的结果相同,我们可以用变量替换整数以使赋值动态化。

你能推荐一些技术来把这个任务合并到一行中吗?到目前为止,我考虑过以下几个选项:

n = 7 # number
m = 5 # divided by

# Option 1) Store array via inline-variable assignment and append last
#           element to align values for the parallel assignment
a, x, y = (t = n.divmod(m)) << t[-1]

# Option 2) Use Array#values_at to repeat some elements
a, x, y = n.divmod(m).values_at 0,1,1

对于那些不熟悉并行分配的人,这篇 SO 帖子涵盖了标准用法。

4

1 回答 1

1

另外的选择

a, x, y = 7.divmod(5).tap {|a| a << a[-1]}
于 2016-07-12T02:26:37.883 回答