Ruby 绑定和解构块参数
在ruby中,有没有一种方法可以同时将块的参数绑定到本地块并对其进行解构 谷歌找不到我的任何东西,在IRB中玩也没有结果,但我想我回忆起了与以下类似的功能: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) 编辑 我突然想到
>> [[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