Ruby load 中没有看到静态方法 class
Ruby load does not see static methods in the class
我正在试验 ruby (2.4.1p111) 和加载方法,它确实有一些奇怪的行为:
我有两个文件:
mytest.rb:
class MyClass
def self.greet(param)
puts "Got called: #{param}"
end
greet 'Called locally'
load "./testld.rb"
end
和加载的文件:
testld.rb:
greet 'Called by load'
我从文档中了解到,从 testld.rb 加载的代码和 MyClass 中的方法调用应该表现相同的。相反,我得到:
-bash-4.2$ ruby mytest.rb
Got called: Called locally
/Blacksmith/RB/testld.rb:1:in `<top (required)>': undefined method `greet'
for main:Object (NoMethodError)
from mytest.rb:9:in `load'
from mytest.rb:9:in `<class:MyClass>'
from mytest.rb:1:in `<main>'
知道我哪里做错了吗?
您需要在testld.rb
中调用MyClass.greet
,那是因为greet
是classMyClass
中定义的class方法.
Here 是 class 方法的文档。
无论您在何处加载文件,加载的文件始终在主环境中进行评估。 testld.rb
主环境中self
的值就是整个脚本的主环境。因此,您的
greet 'Called by load'
不等同于
MyClass.greet 'Called by load'
如你所料。
我正在试验 ruby (2.4.1p111) 和加载方法,它确实有一些奇怪的行为:
我有两个文件:
mytest.rb:
class MyClass
def self.greet(param)
puts "Got called: #{param}"
end
greet 'Called locally'
load "./testld.rb"
end
和加载的文件:
testld.rb:
greet 'Called by load'
我从文档中了解到,从 testld.rb 加载的代码和 MyClass 中的方法调用应该表现相同的。相反,我得到:
-bash-4.2$ ruby mytest.rb
Got called: Called locally
/Blacksmith/RB/testld.rb:1:in `<top (required)>': undefined method `greet'
for main:Object (NoMethodError)
from mytest.rb:9:in `load'
from mytest.rb:9:in `<class:MyClass>'
from mytest.rb:1:in `<main>'
知道我哪里做错了吗?
您需要在testld.rb
中调用MyClass.greet
,那是因为greet
是classMyClass
中定义的class方法.
Here 是 class 方法的文档。
无论您在何处加载文件,加载的文件始终在主环境中进行评估。 testld.rb
主环境中self
的值就是整个脚本的主环境。因此,您的
greet 'Called by load'
不等同于
MyClass.greet 'Called by load'
如你所料。