加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby块采用数组或多个参数

发布时间:2020-12-17 01:51:09 所属栏目:百科 来源:网络整理
导读:今天我很惊讶地发现 ruby自动找到作为块参数给出的数组的值. 例如: foo = "foo"bar = "bar"p foo.chars.zip(bar.chars).map { |pair| pair }.first #= ["f","b"]p foo.chars.zip(bar.chars).map { |a,b| "#{a},#{b}" }.first #= "f,b"p foo.chars.zip(bar.c
今天我很惊讶地发现 ruby自动找到作为块参数给出的数组的值.

例如:

foo = "foo"
bar = "bar"
p foo.chars.zip(bar.chars).map { |pair| pair }.first #=> ["f","b"]
p foo.chars.zip(bar.chars).map { |a,b| "#{a},#{b}" }.first #=> "f,b"
p foo.chars.zip(bar.chars).map { |a,b,c| "#{a},#{b},#{c}" }.first #=> "f,"

我原以为最后两个例子会出现某种错误.

>这是ruby中更一般概念的一个例子吗?
>我不认为我的问题开头的措辞是正确的,我怎么称呼这里发生的事情?

解决方法

Ruby的块函数对它们有一个怪癖,即如果你在包含数组的东西上进行迭代,你可以将它们扩展为不同的变量:

[ %w[ a b ],%w[ c d ] ].each do |a,b|
  puts 'a=%s b=%s' % [ a,b ]
end

这种模式在使用Hash#each时非常有用,并且你想要突破该对的键和值部分:每个{| k,v | …}在Ruby代码中很常见.

如果你的块有多个参数并且迭代的元素是一个数组,那么它会切换参数的解释方式.你可以随时强制扩展:

[ %w[ a b ],%w[ c d ] ].each do |(a,b)|
  puts 'a=%s b=%s' % [ a,b ]
end

这对于事情更复杂的情况很有用:

[ %w[ a b ],%w[ c d ] ].each_with_index do |(a,b),i|
  puts 'a=%s b=%s @ %d' % [ a,i ]
end

因为在这种情况下,它迭代一个数组和另一个被添加的元素,所以每个项实际上是一个内部形式为%w [a b],0的元组,如果你的块只接受一个参数,它将被转换为数组.

这与定义变量时可以使用的原理大致相同:

a,b = %w[ a b ]
a
# => 'a'
b
# => 'b'

这实际上为a和b分配了独立的值.对比:

a,b = [ %w[ a b ] ]
a
# => [ 'a','b' ]
b
# => nil

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读