2011-07-10 29 views
7

當我輸入self時,返回值爲main。我做了這個測試:如果`main`是Object的一個實例,爲什麼我不能調用它?

main2 = Object.new 

然後我可以叫main2,它返回的東西,但是當我打電話main,它提出了一個未定義的變量錯誤。這是如何發生的?

這是我在其他網站上發現這個頂級的環境是如何工作的假設:

class Object 
    Object.new.instance_eval do 
    def self.to_s 
     "main" 
    end 
    private 
    ## 
    # Your program gets inserted here... 
    ## 

    end 
end 

這對我來說很有意義。

回答

14

What is the Ruby Top-Level?」是一篇關於Ruby頂層的文章,它解釋了您需要知道的一切。

但是,您可以使用TOPLEVEL_BINDING.eval('self')在您的程序的任何位置訪問main

+0

什麼是你提供的偉大的文章,現在完全有道理,按照我學習#include Module.new的方式,它只是讓我大開眼界!再次感謝! – mko

+0

順便說一句,從main的singleton類中刪除to_s是一個很好的方式來說明整個結構!大! – mko

1

你不能用的東西指main對象一樣,直接

myvar = main 

這是不可能通過它的「名字」來稱呼它。但是,你可以捕捉它在一個名爲主這樣

main = self 
puts main # => main 

top-level object? top-level methods?」變量是Ruby的發明者本人主要對象的有用的背景資料。

+0

現在我現在的主要是它的單身類的to_s方法的返回值,我可以將它傳遞給一個變量的方式是從它的單例類中移除to_s,然後我返回實例,然後我可以通過它,我從@ banister的文章中學到的東西感謝你們 – mko

4

對irb中的表達式self的評估確實返回打印作爲主要的對象。這裏是一個轉錄應該有所幫助:

$ irb 
>> self 
=> main 
>> main 
NameError: undefined local variable or method `main' for main:Object 
     from (irb):2 
>> self.inspect 
=> "main" 
>> self.class 
>> Object 

當你鍵入main到IRB,它試圖計算變量main未聲明。

+1

另外,如果你改變'self.inspect'(例如返回'「foo」'),self會返回「foo」 –

相關問題