首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于像`[[1,2]].map {|xy@(x,y)| [xy,x+ y]}`这样的参数中的as模式,是否有有效的Ruby语法?

对于像`[[1,2]].map {|xy@(x,y)| [xy,x+ y]}`这样的参数中的as模式,是否有有效的Ruby语法?
EN

Stack Overflow用户
提问于 2018-06-05 04:56:10
回答 2查看 64关注 0票数 3

鉴于以下内容目前在Ruby中工作,就像Haskell的构造函数模式匹配的一个非常有限的版本:

代码语言:javascript
复制
[[1,[2,3]]].map {|(x, (y, z))| x + y * z} #=> [7]

我想知道它是否也支持“as-pattern”( Haskell称之为“as-pattern”)的语法,这基本上是将多个绑定放在相同的参数上,如下所示:

代码语言:javascript
复制
[[1,[2,3]]].map {|(x, yz@(y, z))| [x + y * z, yz]} #=> [7, [2,3]]

我尝试了@和其他符号,但它们都导致了语法错误。

EN

回答 2

Stack Overflow用户

发布于 2018-06-05 06:04:22

据我所知,ruby目前(2018-06-04)还没有这个功能。

没有正式的ruby语言规范可供参考,但有The Ruby Spec Suite。有关块参数的一些奇怪和不同寻常的示例,请查看language/block_spec.rb

块参数非常强大,并且支持可选的args、splats、post-args、析构、嵌套析构、关键字参数、块级变量。这真是令人印象深刻。

如果你能读懂C(我不能),并且你真的想深入研究这一点,你可以在parse.y:2980的解释器语法中找到块参数的定义。

票数 2
EN

Stack Overflow用户

发布于 2018-06-05 06:25:58

不确定as-patterns,但在ruby中,您可以使用lambda & proc实现类似的东西

对于第一个模式

代码语言:javascript
复制
2.3.1 :030 > pattern = Proc.new {|x, y, z| x + (y * z) }
 => #<Proc:0x007fa6fd5a2188@(irb):30> 
2.3.1 :031 > func = lambda { |arr| arr.map {|ar| pattern.call(*ar)} }
 => #<Proc:0x007fa6fddc1328@(irb):31 (lambda)> 
2.3.1 :032 > func.call([[1,2,3], [4,5,6]])
 => [7, 34] 

对于第二个模式

代码语言:javascript
复制
2.3.1 :033 > pattern = Proc.new {|x, y, z| [x + (y * z), [y, z]] }
 => #<Proc:0x007fa6ffba5150@(irb):33> 
2.3.1 :034 > func = lambda { |arr| arr.map {|ar| pattern.call(*ar)} }
 => #<Proc:0x007fa6fdd60aa0@(irb):34 (lambda)> 
2.3.1 :035 > func.call([[1,2,3], [4,5,6]])
 => [[7, [2, 3]], [34, [5, 6]]] 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50688653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档