如何知道用户被调用的模块

时间:2016-02-18 13:34:31

标签: ruby class module call

我有2个模块和1个类:

module B
  def hi
    say 'hi'
  end
end

module C
  def say(message)
    puts "#{message} from ???"
  end
end

class A
  include B
  include C
end

A.new.hi
#=> hi from ???"

我如何才能收到hi from B消息?

2 个答案:

答案 0 :(得分:4)

您可以Kenel#__method__使用Method#owner

<?xml version="1.0" encoding="utf-8"?>
<roottag>
    <shipTo country="US">
        <name>Alice Smith</name>
        <street>123 Maple Street</street>
        <city>Mill Valley</city>
        <state>CA</state>
        <zip>90952</zip>
    </shipTo>
    <billTo country="US">
        <name>Robert Smith</name>
        <street>8 Oak Avenue</street>
        <city>Old Town</city>
        <state>PA</state>
        <zip>95819</zip>
    </billTo>
    <comment>Hurry, my lawn is going wild!</comment>
    <items>
        <item partNum="872-AA">
            <productName>Lawnmower</productName>
            <quantity>1</quantity>
            <USPrice>148.95</USPrice>
            <comment>Confirm this is electric</comment>
        </item>
        <item partNum="926-AA">
            <productName>Baby Monitor</productName>
            <quantity>1</quantity>
            <USPrice>39.98</USPrice>
            <shipDate>1999-05-21</shipDate>
        </item>
    </items>
</roottag>

Kenel#__method__

  

以符号形式返回当前方法定义中的名称。   如果在方法之外调用,则返回nil。

Method#owner

  

返回定义方法的类或模块。

答案 1 :(得分:4)

可以使用caller_locations来确定调用方法的名称,并使用该信息来检索方法owner

module C
  def say(message)
    method_name = caller_locations(1, 1)[0].base_label
    method_owner = method(method_name).owner
    puts "#{message} from #{method_owner}"
  end
end

但这非常脆弱。简单地传递调用模块会更容易,例如:

module B
  def hi
    say 'hi', B
  end
end

module C
  def say(message, mod)
    puts "#{message} from #{mod}"
  end
end