0

我正在试验 ruby​​ (2.4.1p111) 和 load 方法,它确实有一些奇怪的行为:

我有两个文件:

mytest.rb

class MyClass

  def self.greet(param)
   puts "Got called: #{param}"
  end

  greet 'Called locally'

  load "./testld.rb"
end

和加载的文件:

测试ld.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>'

知道我做错了什么吗?

4

2 回答 2

2

你需要调用MyClass.greet进来testld.rb,那是因为greet类中定义了一个类方法MyClass

是类方法的文档。

于 2017-08-09T14:27:03.220 回答
1

无论您在何处加载文件,加载的文件始终在主环境中进行评估。self主环境中的值testld.rb是整个脚本的主环境。因此,您的

greet 'Called by load'

不等于

MyClass.greet 'Called by load'

正如你所料。

于 2017-08-09T14:43:16.090 回答