我想为数组创建一个方法来获得数组的splat。这可以用Ruby做吗?
例如,这是我当前的代码:
[.,]
我希望Array.module_eval do
def to_args
return *self
end
end
返回[1,2,3].to_args
,但最终会返回1,2,3
答案 0 :(得分:6)
你无法从Ruby返回“splat”。但你可以返回一个数组然后自己啪地一声:
def args
[1, 2, 3]
end
x, y, z = args
# x == 1
# y == 2
# z == 3
x, *y = args
# x == 1
# y == [2, 3]
当然,这适用于任何数组,所以实际上不需要将to_args
方法修改为Array
- 这就是调用问题如何使用splat运算符:
arr = [1, 2, 3]
x, y, z = arr
x, *y = arr
*x, y = arr
相同的机制适用于块参数:
arr = [1, 2, 3]
arr.tap {|x, *y| y == [2, 3]}
更高级的用法:
arr = [1, [2, 3]]
x, (y, z) = arr
答案 1 :(得分:1)
为我阐明这一点的概念是,虽然您可以模拟在Ruby中返回多个值,但是一个方法实际上只能返回一个对象,因此该模拟将多个值捆绑在一起阵列。
返回数组,然后您就可以解析它,就像任何数组一样。
def foo
[1, 2]
end
one, two = foo
答案 2 :(得分:0)
不完全是。你试图做的事情(问题没有提供用法示例)是强制多个返回值。但是,返回splatted数组self
可能完全符合您的要求,只要您正确处理等式调用方的多个返回值。
请考虑以下示例:
first, *rest = [1, 2, 3] # first = 1, rest = [2, 3]
*rest, last = [1, 2, 3] # rest = [1, 2], last = 3
first, *rest, last = [1, 2, 3] # first = 1, rest = [2], last = 3
除此之外,我实际上看不到任何方法来捕获或传递多个值,就像你建议的那样。我认为你的问题的答案,如果我理解正确的话,都是调用者的用法。