在 Ruby 中,我一直在寻找一个优雅的单行语句来为多个变量(但不是全部)分配一个通过方法调用从数组返回的公共值。
目标的关键是转换两行语句,例如:
a, x = 1, 2
y = x
Into:a, x, y = 1, 2, 2
无需对重复值进行硬编码。因此,a
得到一个值 (1),而 x
和 y
都共享一个共同值 (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]}