在Ruby中使用&:语法调用自定义方法

时间:2018-10-05 16:40:02

标签: ruby

所以基本上我在看这个简单的例子:

%w[A B C].map(&:downcase)

并对&:语法感兴趣。阅读一些文章后,我认为我明白了(或者至少是这样),所以我决定为Integer实现类似的东西:

class Integer
  def my_multiplier
    puts "66"
  end
end

在这里,我可以利用&:语法的优势,因为我可以这样做:

3.times(&:my_multiplier)

但是,结果当然是数字66的三倍。

我的问题是如何重构我的方法,以便实际上可以使用3.times..中的值?

2 个答案:

答案 0 :(得分:3)

首先,语法为&object,而不是&:&object调用对象上的.to_proc

现在,假设您希望乘数简单地将整数乘以66,则将其写为:

class Integer
  def my_multiplier
    puts 66 * self
  end
end

这将导致

2.5.1 :006 > 3.times(&:my_multiplier)
0
66
132

这等效于呼叫

3.times { |i| i.my_multiplier }

您还可以将my_multiplier定义为proc或lambda,

2.5.1 :001 > p = ->(i) { puts i * 66 }
 => #<Proc:0x00005582b3ae5638@(irb):1 (lambda)> 
2.5.1 :002 > 3.times(&p)
0
66
132

答案 1 :(得分:1)

目前尚不清楚您使用该方法的目的是什么,但是当前整数将以self的形式提供。因此,您可以执行以下操作:

class Integer
  def double 
    self * 2
  end 

end

3.times.map(&:double) # => [0, 2, 4]