Ruby阵列模式匹配
我是Ruby编程新手,并且已经看到它有一些功能。想知道是否有一种方法可以在阵列上进行模式匹配;我希望实现以下目标:Ruby阵列模式匹配,ruby,haskell,functional-programming,Ruby,Haskell,Functional Programming,我是Ruby编程新手,并且已经看到它有一些功能。想知道是否有一种方法可以在阵列上进行模式匹配;我希望实现以下目标: split_string = str.split("_", 2) fst = repo_branch_split.first snd = repo_branch_split.second 以哈斯克尔式的方式: split_string@(fst : snd) = str.split("_", 2) ruby中有没有类似的东西?基本相同。试一试 fst, snd = str.sp
split_string = str.split("_", 2)
fst = repo_branch_split.first
snd = repo_branch_split.second
以哈斯克尔式的方式:
split_string@(fst : snd) = str.split("_", 2)
ruby中有没有类似的东西?基本相同。试一试
fst, snd = str.split("_", 2)
这是Ruby中的并行赋值。可以通过以下方式将数组分配给变量:
fst, snd = str.split("_", 2)
通过将数组的其余部分指定给单个变量,还可以从Haskell实现头/尾行为:
head, *tail = "foo_bar_baz".split("_")
# head => "foo"
# tail => ["bar", "baz"]
如果
tail
中没有星号,它将只分配bar
字符串,baz
将“消失”。@smefju的答案很好,但我将分享一种方法,您可以使用ruby做更多的解构分配
def foo &f
# watch the array get destructured in the block below
f.call [1,2,3,4,5], :sweet, :candy
end
# first block param is array, so we can destructure it if you want
foo do |(x,*xs),y,z|
puts %Q{
x: #{x}
xs: #{xs}
y: #{y}
z: #{z}
}
end
输出
x: 1
xs: [2, 3, 4, 5]
y: sweet
z: candy
acc: {}
k: a
v: 1
acc: {:a=>1}
k: b
v: 2
acc: {:a=>1, :b=>4}
k: c
v: 3
=> {:a=>1, :b=>4, :c=>9}
这在各种方面都很有用
hash = {a: 1, b: 2, c: 3}
hash.reduce({}) do |acc,(k,v)|
puts %Q{
acc: #{acc}
k: #{k}
v: #{v}
}
acc.merge(k => v * v)
end
输出
x: 1
xs: [2, 3, 4, 5]
y: sweet
z: candy
acc: {}
k: a
v: 1
acc: {:a=>1}
k: b
v: 2
acc: {:a=>1, :b=>4}
k: c
v: 3
=> {:a=>1, :b=>4, :c=>9}
除了对数组进行解构之外,Ruby在这个部门还相当缺乏。你没有得到真正的散列解构,Ruby中也没有实际的模式匹配。这是目前为止唯一的答案,它回答了前面提到的问题,并揭示了“并行分配”和“模式匹配”之间的区别。顺便说一句,OP中的Haskell片段不是严格意义上的模式匹配示例,它非常有趣。现在我们只需要Ruby.FYI中的case/matching行为,这通常(在语言不可知的意义上)称为解构或解构绑定,而不是模式匹配。