如何在ruby中将服务对象/模块作为参数传递

时间:2016-12-06 13:24:55

标签: ruby ruby-on-rails-3 metaprogramming

是否可以将模块或对象用作ruby中每个方法的参数?

我需要类似的东西。

module PrintAny
  def call(text)
    puts text
   end
end

["any"].each PrintAny

2 个答案:

答案 0 :(得分:7)

几乎。您可以将模块转换为proc并以这种方式使用它:

module PrintAny
  def self.print(text)
    puts text
  end

  def self.to_proc
    method(:print).to_proc
  end
end

["any"].each &PrintAny # => prints "any"

Enumerable#each要求您传递一个块,&符号运算符(&)通过首先在该对象上调用to_proc来将对象转换为块。模块只是对象,因此如果它们有方法to_proc,这将起作用。

答案 1 :(得分:2)

我不知道什么时候可以在现实生活中使用它,但是......:

['any'].each &PrintAny.instance_method(:call).bind(Object)
#=> any