我已经创建了一个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
但不能访问它?
答案 0 :(得分:5)
正如你在问题中所说的那样,hello
是一种实例方法,首先你需要将你的模块混合成某种东西,这样你就可以拥有一个实例来调用它。
当您在顶级include
混音时,这基本上等同于
class Object
include TestExt
end
将TestExt
混合到Object
中,从而使hello
可用作Object
类的实例方法。由于所有都继承自Object
,包括Module
,因此hello
模块和匿名{{1}都可以使用TestExt
实例方法object(这是main
在顶层评估的内容)。
尝试self
,它也可以使用,因为您将''.hello
混合到TestExt
和Object
继承自String
。
您是否始终必须加入扩展程序?
没有
是否有另一种包含方法不会使方法hello成为全局?
是的:在全球范围内不要Object
。
为什么我可以在TestExt.instance_methods中看到你好但不能访问它?
因为它是一个实例方法。