微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby – 块变量中的括号

特定
a = [[:a,:b,:c]]

1)我理解这一点

a.each{|(x,y),z| p z} # => :b

有两个变量(x,y)和z,所以第三个元素:c被抛弃,z匹配:b.我理解这一点

a.each{|(x,z| p y} # => nil

(x,y)匹配:a,因为它不是数组,所以没有元素,因此y匹配nil.

但是怎么做

a.each{|(x,z| p x} # => :a

工作?我希望能返回nil.

2)为什么返回值是这样的?

a.each{|(x,y)| p x} #=> :a
a.each{|(x,y)| p y} #=> :b

我希望他们都能归零.

解决方法

这是因为并行赋值的语法.
a = [[:a,:c]]

所以a.each只有一个要迭代的元素,即[:a,:b,:c].

在第一种情况下:

(x,z = [:a,:c]
#=> x == :a,y == nil,z == :b

这里(x,y)是一个匹配第一个元素的数组:a,x得到它,然后z只是匹配第二个元素:b.

在第二种情况下:

(x,y) = [:a,y == :b

这里(x,y)作为整个数组匹配数组[:a,:c],所以x,y得到:a和:b相应.

这就像需要args可选的args(关键字args)rest args组合匹配提供的参数.只是“聪明”按顺序接受参数.

一个聪明的例子

(a,b) = 1,2
=> [1,2] # array match
#=> a == 1,b == 2

(a,b)=[1,2]
=> [1,b == 2

对于上面的任何情况,它只是最好地猜测应该采取什么.

原文地址:https://www.jb51.cc/ruby/265332.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐