Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中,有没有一种定义加载上下文的方法?_Ruby - Fatal编程技术网

在Ruby中,有没有一种定义加载上下文的方法?

在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

我想在块中加载一个文件,并在对象实例的上下文中计算语句。例如,类似这样的事情:

我有一个名为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_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