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

ruby – 显式生成符号#to_proc的n值

发布时间:2020-12-17 02:35:07 所属栏目:百科 来源:网络整理
导读:在 discovered tonight中,Ruby的 Symbol#to_proc 处理除第一个之外的其他产生的值作为方法调用的参数.换句话说,这两个方法调用是等价的: yields_three{ |a,b,c| a.foo(b,c) }yields_three( :foo ) 我认为这可能是一个强大的(或至少是有趣的)成语,所以我尝试
在 discovered tonight中,Ruby的 Symbol#to_proc处理除第一个之外的其他产生的值作为方法调用的参数.换句话说,这两个方法调用是等价的:

yields_three{ |a,b,c| a.foo(b,c) }
yields_three( &:foo )

我认为这可能是一个强大的(或至少是有趣的)成语,所以我尝试了以下内容:

class Player
  def add_score( points )
    @score += points
  end
end

my_array_of_players.zip( my_array_of_turn_scores ).each(&:add_score)

不幸的是,这不起作用:

NoMethodError: undefined method `add_score' for [<#Player 'Phrogz'>,42]:Array

所以,问题是:你能编写一个Enumerator#explicit方法,而不是产生一个值数组,而是显式地产生所有这些值吗?

如果你成功了,这些应该有效:

pairs = [[1,2],[3,4],[5,6]]
pairs.map.explicitly(&:+) #=> [3,7,11]
pairs.map.explicitly(&:*) #=> [2,12,30]

class String
  def say_hey(b)
    puts "#{self} says 'hey' to #{b}"
  end
end
('a'..'d').each_cons(2).explicitly(&:say_hey)
#=> "a says 'hey' to b"
#=> "b says 'hey' to c"
#=> "c says 'hey' to d"

解决方法

这是你如何做到的:

class Enumerator
  def explicitly
    each { |e| yield(*e) }
  end
end

我对此执行了测试,并返回了正确的结果.

更新:更改为不显式捕获块.

(编辑:李大同)

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

    推荐文章
      热点阅读