如何从Ruby中的方法返回splat

时间:2016-05-03 20:48:58

标签: ruby

我想为数组创建一个方法来获得数组的splat。这可以用Ruby做吗?

例如,这是我当前的代码:

[.,]

我希望Array.module_eval do def to_args return *self end end 返回[1,2,3].to_args,但最终会返回1,2,3

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

除此之外,我实际上看不到任何方法来捕获或传递多个值,就像你建议的那样。我认为你的问题的答案,如果我理解正确的话,都是调用者的用法。