【发布时间】:2012-12-15 07:58:32
【问题描述】:
好的,我在加载特定库或更多库时遇到了一点问题,该库可能超出范围。在这种情况下会发生这种情况吗?
主要问题:需要函数中的库,以便它们可以在全局范围内使用。 示例:
class Foo
def bar
require 'twitter_oauth'
#....
end
def bar_2
TwitterOAuth::Client.new(
:consumer_key => 'asdasdasd',
:consumer_secret => 'sadasdasdasdasd'
)
end
end
temp = Foo.new
temp.bar_2
现在为了解决我的问题,我正在尝试运行 eval 将其绑定到全局范围...像这样
$Global_Binding = binding
class Foo
def bar
eval "require 'twitter_oauth'", $Global_Binding
#....
end
def bar_2
TwitterOAuth::Client.new(
:consumer_key => 'asdasdasd',
:consumer_secret => 'sadasdasdasdasd'
)
end
end
temp = Foo.new
temp.bar_2
但这似乎没有奏效……有什么想法吗?有没有更好的方法来做到这一点?
【问题讨论】:
-
require始终在顶层执行,即使在内部类/模块的深处调用也是如此。require解析文件并执行其代码,因此其内容永远不会超出范围。您的代码中发生的情况是您从不调用 bar,因此永远不会执行 require。 -
一个类定义被“执行”。如果您在类内部但在方法定义之外的任何位置编写
puts "in class #{self.name}"语句,您会立即看到in class Foo显示在控制台上。def(并且只有def)也被执行了,Ruby将方法的名称存储到类的实例方法表中,但是此时方法的内容并没有被执行。该方法的主体仅在您执行、调用它、将其作为消息发送到作为该类实例的对象时才会执行。 -
啊,你确实是对的。我的代码中发生的事情是,当到达某一行时,库花了很长时间才加载,这些库不可用。非常感谢。