ruby - 在所有方法调用之前执行代码

标签 ruby

我在很多方面对 Ruby 还很陌生,所以在尝试执行此操作时有点困难(通过模块?还是基类?)。

我想为类上执行的每个方法调用执行“puts”。类似于 cucumber 格式化程序的一个非常简单的形式,即:

class MyClass
    def method_a
        puts 'doing some stuff'
    end 
end

输出如下:

MyClass.new.method_a => 'methods_a', 'doing some stuff'

更重要的是,我希望它适用于任何类上的任何方法(动态地,不会乱七八糟我的代码)。我想应用一些格式,即“method_a”=>“Method A”。最好的方法是什么? AOP框架?

最佳答案

class MyClass
  def method_a
    puts "Doing A..."
  end

  def method_b
    puts "Doing B..."
  end

  def self.call_before_all_methods
    all_instance_methods = instance_methods - Class.instance_methods
    all_instance_methods.each do |x|
      class_eval <<-END
        alias old_#{x} #{x}
        def #{x}
          print "\'#{x.to_s.split('_').each{|x| x.capitalize!}.join(' ')}\', "
          old_#{x}
        end
        # remove_method old_#{x}.to_sym
      END
    end
  end

  private_class_method :call_before_all_methods
  call_before_all_methods
end

a = MyClass.new
a.method_a
a.method_b

所以这里的技巧是先为每个方法创建一个别名,然后通过“打印格式化方法名称”+“作为别名的原始方法”重新定义该方法。它还由此处文档 (<<-END) 动态处理。

但是由于每个方法的重新定义都会调用其原始方法,因此最终无法remove_methodundef别名。我认为将所有这些别名 (old_method_a, old_method_b) 保留在那里并不是什么大问题。

关于ruby - 在所有方法调用之前执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12299219/

相关文章:

ruby - Guard-process optipng 监视新图像文件夹

ruby 包和十六进制值

ruby - 使用哈希值渲染 ERB 模板

sql - 范围 : Sort by difference between two dates

ruby - 在运行时使用字符串作为变量

ruby - 了解 XOR 逻辑运算符

ruby-on-rails - 在 Rails 中检索数据库记录

ruby - 在 Windows 上运行 ruby​​ 脚本

ruby-on-rails - Rails Ransack - 如何在 ransacker 中包含多个条件

ruby - 如何使用 ruby​​zip 将 zip 存档中的目录复制到第二个 zip 存档?