是否可以在 Ruby 中反转一个 splat?
Is it possible to invert a splat in Ruby?
Ruby 的 splat 运算符 *
可用于合并
def one_argument(*a)
...
end
one_argument(1, 2, 3)
或拆分
def multiple_arguments(a, b, c)
...
end
multiple_arguments(*[1, 2, 3])
多个值,具体取决于上下文。
是否可以创建一个充当 "inverse splat" 运算符的方法?要充当逆运算,运算符必须满足:
inverse_splat(*(foo)) == foo
和
*(inverse_splat(foo)) == foo
关于*(inverse_splat(foo))
,没有意义。 splatting 的结果通常是一系列对象,而不是对象。 Ruby.
中不可能存在这样的东西
此时,您似乎做出的假设,即 inverse_splat
和 *
的顺序可以互换,结果证明是错误的。
关于inverse_splat(*(foo))
不可能有这样的逆。这是因为 splat *
内部调用 to_a
,这不是 one-to-one 映射。
[[:a, 1], [:b, 2]].to_a
# => [[:a, 1], [:b, 2]]
{a: 1, b: 2}.to_a
# => [[:a, 1], [:b, 2]]
逆只能在 one-to-one 地图上定义。
如果您忽略此类情况并仍想探索是否有接近它的东西,那么接近的东西就是 [
...]
文字。
除了的一个简单例子:
def inverse_splat(*args)
args
end
inverse_splat(*nil) #=> []
inverse_splat(*[]) #=> []
inverse_splat(*{}) #=> []
inverse_splat() #=> []
以上都是以同样的方式调用方法。无法从方法内部区分调用,因此您无法重建原始对象。
Ruby 的 splat 运算符 *
可用于合并
def one_argument(*a)
...
end
one_argument(1, 2, 3)
或拆分
def multiple_arguments(a, b, c)
...
end
multiple_arguments(*[1, 2, 3])
多个值,具体取决于上下文。
是否可以创建一个充当 "inverse splat" 运算符的方法?要充当逆运算,运算符必须满足:
inverse_splat(*(foo)) == foo
和
*(inverse_splat(foo)) == foo
关于
中不可能存在这样的东西*(inverse_splat(foo))
,没有意义。 splatting 的结果通常是一系列对象,而不是对象。 Ruby.此时,您似乎做出的假设,即
inverse_splat
和*
的顺序可以互换,结果证明是错误的。关于
inverse_splat(*(foo))
不可能有这样的逆。这是因为 splat
*
内部调用to_a
,这不是 one-to-one 映射。[[:a, 1], [:b, 2]].to_a # => [[:a, 1], [:b, 2]] {a: 1, b: 2}.to_a # => [[:a, 1], [:b, 2]]
逆只能在 one-to-one 地图上定义。
如果您忽略此类情况并仍想探索是否有接近它的东西,那么接近的东西就是
[
...]
文字。
除了
def inverse_splat(*args)
args
end
inverse_splat(*nil) #=> []
inverse_splat(*[]) #=> []
inverse_splat(*{}) #=> []
inverse_splat() #=> []
以上都是以同样的方式调用方法。无法从方法内部区分调用,因此您无法重建原始对象。