为什么我必须包含一个扩展来访问其模块的方法?

时间:2011-10-23 13:09:03

标签: ruby

我已经创建了一个ruby C扩展TestExt,成功编译了它,但是当我尝试在irb中使用它时,我只能在调用include TestExt之后访问它的方法。

我正在测试它:

c:/test>irb -I lib
irb(main):001:0> require 'TestExt'
=> true
irb(main):002:0> TestExt.hello()
NoMethodError: undefined method `hello' for TestExt:Module
        from (irb):2
        from C:/Ruby192/bin/irb:12:in `<main>'
irb(main):003:0> TestExt.instance_methods
=> [:hello]
irb(main):004:0> include TestExt
=> Object
irb(main):005:0> TestExt.hello()
=> 0
irb(main):006:0> hello()
=> 0

您是否始终必须include分机?是否有一种替代的包含方式不会使方法hello全局化?为什么我可以在hello中看到TestExt.instance_methods但不能访问它?

1 个答案:

答案 0 :(得分:5)

正如你在问题中所说的那样,hello是一种实例方法,首先你需要将你的模块混合成某种东西,这样你就可以拥有一个实例来调用它。

当您在顶级include混音时,这基本上等同于

class Object
  include TestExt
end

TestExt混合到Object中,从而使hello可用作Object类的实例方法。由于所有都继承自Object,包括Module,因此hello模块和匿名{{1}都可以使用TestExt实例方法object(这是main在顶层评估的内容)。

尝试self,它也可以使用,因为您将''.hello混合到TestExtObject继承自String

  

您是否始终必须加入扩展程序?

没有

  

是否有另一种包含方法不会使方法hello成为全局?

是的:在全球范围内不要Object

  

为什么我可以在TestExt.instance_methods中看到你好但不能访问它?

因为它是一个实例方法。