在Ruby中,有没有一种定义加载上下文的方法?
我想在块中加载一个文件,并在对象实例的上下文中计算语句。例如,类似这样的事情: 我有一个名为foo_file的文件,它只包含这一行(语句) 我希望在Foo实例的上下文中调用这个“语句”,如下所示在Ruby中,有没有一种定义加载上下文的方法?,ruby,Ruby,我想在块中加载一个文件,并在对象实例的上下文中计算语句。例如,类似这样的事情: 我有一个名为foo_file的文件,它只包含这一行(语句) 我希望在Foo实例的上下文中调用这个“语句”,如下所示 class Foo def some_method puts "hello" end end foo = Foo.new foo.instance_eval do load "foo_file" # load and execute statement some_m
class Foo
def some_method
puts "hello"
end
end
foo = Foo.new
foo.instance_eval do
load "foo_file" # load and execute statement some_method from a foo_file.
end
这在以下情况下失败:
foo_file:1:in `<top (required)>': undefined local variable or method `some_method' for main:Object (NameError)
因此,当我在传递给instance_eval的块中调用load时,语句被加载到顶层上下文中,而不是实例foo中
我可以用下面显示的代码来解决这个问题。我创建了一个顶级方法,它封装了对实例方法的调用。我仍然需要提供上下文,这是我通过单例实现的
require 'singleton'
class Context
include Singleton
attr_accessor :ctx
end
def some_method
ctx = Context.instance.ctx
ctx.some_method
end
Context.instance.ctx = foo
load "bar_file"
我认为这会起作用,但似乎应该有更好的方法(比如刚开始加载到正确的上下文中)。有什么建议吗?在这种情况下,获得您想要的东西非常容易,甚至不需要调用
load
:
foo.instance_eval(File.read(file))
例如,如果文件
中只有文本长度
,则
"Hello".instance_eval(File.read(file))
将返回5
更一般地说,如果要指定任意上下文,这基本上就是您希望使用可选参数的确切情况:
请不要在文本中使用“编辑”或“更新”标题。如果需要,我们可以查看编辑的内容和时间。相反,将更改合并到文本中,就像您最初添加它一样。见@theTinMan:很公平。更好?
foo.instance_eval(File.read(file))
"Hello".instance_eval(File.read(file))
bnd = 'Hello'.instance_exec { x = 3; binding }
eval('length + x',bnd) #=> 8