Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby阵列模式匹配_Ruby_Haskell_Functional Programming - Fatal编程技术网

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

我是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.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行为,这通常(在语言不可知的意义上)称为解构或解构绑定,而不是模式匹配。