ruby - 有没有办法判断 `method_missing` 是否被显式调用?

标签 ruby metaprogramming

在方法定义中,有没有办法判断方法 method_missing 是被显式调用还是作为钩子(Hook)方法被调用?

使用方法initialize,可以通过执行以下操作来判断它是被显式调用还是作为钩子(Hook)调用:

class A
  def initialize
    puts caller
  end
end

当作为钩子(Hook)调用时,initialize 方法有一行 new:

a = A.new
# => ...:in `new'
# => ...
# => ...:in `<main>'

当显式调用时,它没有这样的行(除非它是从 new 显式调用的):

a.send(:initialize)
# => ...
# => ...:in `<main>'

但是当我用 method_missing 做类似的事情时,我无法区分这两种情况:

class A
  def method_missing *;
    puts caller
  end
end

a.foo
# => ...
# => ...:in `<main>'

a.method_missing
# => ...
# => ...:in `<main>'

最佳答案

你可以检查第一个参数:

class A
  def method_missing(name = nil, *)
    if name
      puts "called via `#{name}'"
    else
      puts "called directly"
    end
  end
end

A.new.foo
#=> called via `foo'

A.new.method_missing
#=> called directly

关于ruby - 有没有办法判断 `method_missing` 是否被显式调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35250641/

相关文章:

ruby - 如何从 Ruby 中的 Mocha 模拟返回动态值

reflection - 反射(reflection)的词源?

c++ - 元编程成员检查器不适用于返回具有基类的类型的函数成员

c++ - typedef 使用类型名

ruby - 在 Ruby 的 class_eval 中将 block 传递到嵌套方法中?

ruby - 从 Ruby 打开 RSA 私钥

ruby-on-rails - Rails 如何在浏览器中编辑和保存文件?

ruby-on-rails - 使用服务类中的计算属性构建哈希

ruby-on-rails - Ruby on Rails - SoundCloud OAuth 2 未定义方法 `access_token'

c++ - 元编程,阶乘,C++,boost