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