Ruby数组模式匹配

时间:2016-08-10 13:14:08

标签: ruby haskell functional-programming

我是Ruby的编程新手,并且已经看到它具有一些功能。想知道是否有一种方法可以在阵列上进行模式匹配;我希望完成以下任务:

split_string = str.split("_", 2)
fst = repo_branch_split.first
snd = repo_branch_split.second

以类似Haskell的方式:

split_string@(fst : snd) = str.split("_", 2)

红宝石中是否有类似的东西?

3 个答案:

答案 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中没有实际的模式匹配