我想访问程序
中顶级主对象中定义的变量和方法@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两次。
答案 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"