2017-01-16 119 views
2

我想要訪問在頂層主要對象中定義的變量和方法在程序EVAL和紅寶石綁定

@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被調用兩次。

回答

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

"instanceMethodMain"被打印的兩倍,因爲雙p

p eval("instanceMethodMain", TOPLEVEL_BINDING) 

被翻譯成

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

刪除任何一個會打印"instanceMethodMain"只有一次:

def instanceMethodMain 
    "instanceMethodMain" 
end 


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