Ruby 绑定和解构块参数

Ruby 绑定和解构块参数,ruby,Ruby,在ruby中,有没有一种方法可以同时将块的参数绑定到本地块并对其进行解构 谷歌找不到我的任何东西,在IRB中玩也没有结果,但我想我回忆起了与以下类似的功能: >> [[1, 2], [3, 4]].map{|x@(y, z)| [x, y, z]} => [[[1, 2], 1, 2], [[3, 4], 3, 4]] 其中,x捕获迭代对象的每个顶级元素(在这种情况下,首先[1,2],然后[3,4])和y和z捕获x内部对象的子元素(分别是1然后3和2然后4) 编辑 我突然想到

在ruby中,有没有一种方法可以同时将块的参数绑定到本地块并对其进行解构

谷歌找不到我的任何东西,在IRB中玩也没有结果,但我想我回忆起了与以下类似的功能:

>> [[1, 2], [3, 4]].map{|x@(y, z)| [x, y, z]}
=> [[[1, 2], 1, 2], [[3, 4], 3, 4]]
其中,
x
捕获迭代对象的每个顶级元素(在这种情况下,首先
[1,2]
,然后
[3,4]
)和
y
z
捕获
x
内部对象的子元素(分别是
1
然后
3
2
然后
4

编辑 我突然想到,我投射到Ruby中的功能实际上来自Haskell:

不过,有没有一种优雅的方法可以在Ruby中实现同样的效果呢?

这个怎么样

2.3.0 :003 > x, (y, z) = [[1, 2], [3, 4]]
 => [[1, 2], [3, 4]]
2.3.0 :004 > x
 => [1, 2]
2.3.0 :005 > y
 => 3
2.3.0 :006 > z
 => 4
还是这个

2.3.0 :007 > x = [[1, 2], [3, 4]]
 => [[1, 2], [3, 4]]
2.3.0 :008 > y, z = x
 => [[1, 2], [3, 4]]
2.3.0 :009 > y
 => [1, 2]
2.3.0 :010 > z
 => [3, 4]
或者,如果您真的想将它们合并到一个语句中(尽管这可能不太清楚):

我可能不明白你想做什么;我不认为
map
是您想要的,因为它对输入数组中的所有元素执行相同的操作,并且您混合了整个数组和数组元素操作。这里有一个方法可以做你想做的,我不知道

2.3.0 :017 > def f(x)
2.3.0 :018?>   y, z = x
2.3.0 :019?>   yield x, y, z
2.3.0 :020?>   end
 => :f
2.3.0 :030 > f([[1, 2], [3, 4]]) { |x, y, z| p x; p y; p z }
[[1, 2], [3, 4]]
[1, 2]
[3, 4]

您可以创建一个自定义数组方法来完成任务:

class NestedArray < Array
  def each(&blk)
    super { |array| blk.call(array, *array) }
  end
  def map(&blk)
    super { |array| blk.call(array, *array) }
  end
end
附加参数是可选的,即您仍然可以编写

nested_array.each { |x| puts x }
即使您选择不使用
y
z
参数,它仍然可以工作

我想要一个将[1,2],[3,4]]分配给x,[1,2]分配给y,[3,4]分配给z的解

这个怎么样:

irb(main):001:0> y, z = x = [[1, 2], [3, 4]]
=> [[1, 2], [3, 4]]
irb(main):002:0> y
=> [1, 2]
irb(main):003:0> z
=> [3, 4]
irb(main):004:0> x
=> [[1, 2], [3, 4]]
更新(让我们把它放到一个块中)

这对你合适吗:

[[1, 2], [3, 4]].tap do |arr| 
  y, z = x = arr 
  p x # => [[1, 2], [3, 4]]
  p y # => [1, 2]
  p z # => [3, 4]
end

你能解释一下x y和z在这里指的是什么吗?@maxpleaner试图更新这个问题,尽管我不确定我是否真的帮助了问题的起因使用你的例子,我想要一个解决方案,将
[[1,2],[3,4]]
分配给
x
[1,2]
分配给
y
[3,4]
分配给
z
。类似于@scorix的答案,这既可以绑定也可以解构,但也不在块的上下文中。想法不错,但我不知道是否回答了这个问题。是的!但是现在我们能把它放到一个块中吗?顺便说一句,您不需要额外的变量
arr
。只是
。每个{x | y,z=x;…}
谢谢!虽然您确实使用
NestedArray
展示了我的问题的解决方案,但关于哈希处理块参数与处理数组不同的部分似乎是错误的。我相信您给出的哈希示例与数组数组的工作原理相同。您是对的,我删除了错误/不相关的部分。
irb(main):001:0> y, z = x = [[1, 2], [3, 4]]
=> [[1, 2], [3, 4]]
irb(main):002:0> y
=> [1, 2]
irb(main):003:0> z
=> [3, 4]
irb(main):004:0> x
=> [[1, 2], [3, 4]]
[[1, 2], [3, 4]].tap do |arr| 
  y, z = x = arr 
  p x # => [[1, 2], [3, 4]]
  p y # => [1, 2]
  p z # => [3, 4]
end