eval和红宝石结合

时间:2017-01-16 13:28:03

标签: ruby binding

我想访问程序

中顶级主对象中定义的变量和方法
@x = :hello

def instanceMethodMain
p  "instanceMethodMain"  
end

class Baz
  def method
     p eval("@x", TOPLEVEL_BINDING)
     p eval("instanceMethodMain", TOPLEVEL_BINDING)
  end  
end

Baz.new.method

输出

:hello
"instanceMethodMain"
"instanceMethodMain"

即使我使用

,输出也是一样的
mainRef=TOPLEVEL_BINDING.eval('self')
p mainRef.send :instanceMethodMain

有人可以解释为什么会调用instanceMethodMain两次。

2 个答案:

答案 0 :(得分:3)

instanceMethodMain没有被调用两次。

您可以添加

进行检查
def instanceMethodMain
  puts "BEEN HERE"
  p  "instanceMethodMain"  
end
p为参数调用

"instanceMethodMain"两次。

p p "instanceMethodMain"
#=> "instanceMethodMain"
#=> "instanceMethodMain"

请注意,p "string"显示"string" 返回"string",而puts "string"显示string并返回nil

puts puts "instanceMethodMain"
#=> instanceMethodMain
#=> 

答案 1 :(得分:1)

由于双"instanceMethodMain"

p打印两次。

p eval("instanceMethodMain", TOPLEVEL_BINDING)

被翻译成

p p "instanceMethodMain"
#=> "instanceMethodMain"
#=> "instanceMethodMain"

删除其中任何一个只打印"instanceMethodMain"一次:

def instanceMethodMain
  "instanceMethodMain"  
end


Baz.new.method
#=> :hello
#=> "instanceMethodMain"