通过并行赋值为变量子集赋值一个公共值



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

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

a, x = 1, 2
y = x

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

为了将示例扩展到用例中,假设不是直接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 帖子涵盖了标准用法。

另一种选择

a, x, y = 7.divmod(5).tap {|a| a << a[-1]}

最新更新