我正在用Ruby 1.9.2编写一个模块,它定义了几个方法.当调用这些方法中的任何一个时,我希望它们中的每一个都先执行一条特定的语句.

module MyModule
  def go_forth
    a re-used statement
    # code particular to this method follows ...
  end

  def and_multiply
    a re-used statement
    # then something completely different ...
  end
end

但我想避免在每个方法中都显式地使用这a re-used statement个代码.有没有办法做到这一点?

(如果重要的话,a re-used statement将让每个方法在调用时打印自己的名称.它将通过puts __method__的一些变体来实现.)

推荐答案

这样地:

module M
  def self.before(*names)
    names.each do |name|
      m = instance_method(name)
      define_method(name) do |*args, &block|  
        yield
        m.bind(self).(*args, &block)
      end
    end
  end
end

module M
  def hello
    puts "yo"
  end

  def bye
    puts "bum"
  end

  before(*instance_methods) { puts "start" }
end

class C
  include M
end

C.new.bye #=> "start" "bum"
C.new.hello #=> "start" "yo"

Ruby相关问答推荐

如何使用另一个Ruby 中的Ruby 中的区域设置?

关键字if是什么对象类型/类?

如何在Ruby中匹配大型IP网络对象列表中的IP地址

从整数中 Select 重复数字的字符串

VS Code Prettier 打破哈希访问

环绕分隔线,保留第一列,最小最终长度

如何使用正则表达式在字符串中查找特定匹配项

Symfony 2assets资源过滤器异常中的指南针

减少哈希值

构造Ruby的现代方法是什么?

我应该签入.ruby-gemset和/或.ruby-version吗?

Ruby 在与源相同的目录中加载配置(yaml)文件

Broken pipe (Errno::EPIPE)

STDERR.puts 与 Ruby 中的 puts 有何不同?

在现有 Jekyll 安装中切换主题

无法将 RVM 安装的 Ruby 与 sudo 一起使用

Ruby RVM apt-get 更新错误

在 Ruby 中获取用户主目录的跨平台方法?

为什么我们在 Ruby 中有 0.0 和 -0.0?

Ruby:如何将数组数组连接成一个