ruby - 如何在 Ruby 中使用 before 和 after 包装方法?

标签 ruby metaprogramming ruby-1.9.3

有没有更好的方法来实现以下目标?将方法列为符号似乎有点笨拙......

此代码在 4 种方法中的每一种方法之前运行 init 并在之后运行 draw。下面的代码可以工作,但是有没有更可读或更惯用的方法?

Class DrawMap
  def draw_method_1
    ...
  end

  def draw_method_2
    ...
  end

  def draw_all
    [:draw_method_1, :draw_method_2, :draw_method_3, :draw_method_4].each do |method|
      init_draw
      send method
      @draw.draw
    end
  end

...

Rails before 和 after 过滤器会执行相同的操作,但这不是 Rails 应用程序。

ruby 1.9.3

最佳答案

如果您只是想让上面的代码稍微更简洁,您可以尝试以下操作:

def draw_all
  (1..4).each do |n|
    init_draw
    send "draw_method_#{n}"
    @draw.draw 
  end
end

否则,有一个非常好的SO问题right here这真的会对你有帮助。它涉及一些元编程,基本上重新定义方法并用一些附加代码包装它们。在您的情况下,您将使用 init_drawdraw 进行包装。

关于ruby - 如何在 Ruby 中使用 before 和 after 包装方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12884360/

相关文章:

ruby - IntelliJ IDEA "Cannot find ' 需要'"

jquery - 将 json 对象解析为 ruby​​ 对象时出错

ruby - 类对象,单例类

Ruby,Windows 剪贴板错误?

Ruby:在模块中动态定义类方法

c++ - 通用回调

metaprogramming - `use` 和 `@before_compile` 有什么区别?

ruby - 如何使用 selenium-webdriver 获取第三个最后值 boo?

ruby - 如何使用 new 干净地初始化 Ruby 中的属性?

ruby - 在 1.9.3 中读取文件时跳过第一行