我是Ruby的编程新手,并且已经看到它具有一些功能。想知道是否有一种方法可以在阵列上进行模式匹配;我希望完成以下任务:
split_string = str.split("_", 2)
fst = repo_branch_split.first
snd = repo_branch_split.second
以类似Haskell的方式:
split_string@(fst : snd) = str.split("_", 2)
红宝石中是否有类似的东西?
答案 0 :(得分:9)
这是Ruby中的并行赋值。您可以通过这种方式为变量分配数组:
fst, snd = str.split("_", 2)
您还可以通过将数组的其余部分分配给单个变量来实现Haskell的头/尾行为:
head, *tail = "foo_bar_baz".split("_")
# head => "foo"
# tail => ["bar", "baz"]
tail
中没有星标,它只会分配bar
字符串而baz
会“消失”。
答案 1 :(得分:2)
几乎一样。尝试
fst, snd = str.split("_", 2)
答案 2 :(得分:2)
@ 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
这在各种方面都很有用
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
输出
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中没有实际的模式匹配。