2015-12-09 173 views
3

決心書說,所有標識符和變量我們聲明/初始化/定義紅寶石將被包含在內部符號表爲標誌;那麼只要包含的符號在程序中的任何位置使用,Ruby就會查找它。例如,在該過程:如何符號紅寶石

  • a = "1"
  • 紅寶石包括可變a作爲:a其表裏面。
  • a在程序用於:

    def a 
        puts "stack_overflow" 
    end 
    

可變a和標識符def a具有存儲在其中的單個符號:a。我使用Symbol.all_symbols.count檢查了符號計數。計數是一樣的;即加入def a沒有增加符號表的數量。

當代碼中的任何地方看到a時,ruby如何區分變量a和標識符def a

s = :x,是符號變量s存儲在符號表中,還是隻是:x

回答

4

計數是相同的;即加入def a沒有增加符號表的數量。

這是因爲符號:a已經存在:

$ ruby -e "puts Symbol.all_symbols.count" 
2504 

$ ruby -e "puts Symbol.all_symbols" | grep ^a | sort | head -n 5 
a 
abort 
abort_on_exception 
abort_on_exception= 
abs 

您可以用--disable-gems選項,以擺脫它(和許多其他符號)開始紅寶石:

$ ruby --disable-gems -e "puts Symbol.all_symbols.count" 
1689 

$ ruby --disable-gems -e "puts Symbol.all_symbols" | grep ^a | sort | head -n 5 
abort 
abort_on_exception 
abort_on_exception= 
abs 
abs2 

現在,定義或引用a實際上增加了符號計數:

$ ruby --disable-gems -e "puts Symbol.all_symbols.count" 
1689 

$ ruby --disable-gems -e "def a; end; puts Symbol.all_symbols.count" 
1690 

$ ruby --disable-gems -e "a = 1; puts Symbol.all_symbols.count" 
1690 
+0

Stefan謝謝!,但它不是關於我的數量好奇,我們知道,因爲符號的獨特性,計數顯然不會增加,這完全是關於紅寶石所作的區分以及它如何在「a」和def「a」之間形成的,雖然它們都變成了單一符號「:a 「 –

+1

@RichardGeorge the symb ol表用於跟蹤定義的符號,即它基本上是所有符號的數組。它不存儲任何對變量或方法的引用。 – Stefan

+0

來自The Well Grounded Rubyist的FWIW,「符號表基本上是一個基於整數的散列。」 – mackshkatz

1

符號深處實際上是一個常數字符串到整數的映射和查找之後他們行爲這種方式,例如 - 上的符號索引是比上一字符串(如果散列具有符號鍵),還符號更快變量消耗盡可能多的內存Fixnums

關於查找 - 紅寶石對每一個執行上下文,其中有局部變量表「環境」,因此,他們嵌套的名字可以被重載。全球範圍也有背景。

所以看到一個名稱(此時名稱已經是一個符號) - ruby​​在當前上下文中查找帶有該名稱的變量,然後查找方法,然後在父上下文中再次查找等等(簡化,還有其他一些事情選中)

+0

:輸精管,是否有任何明確的層次有像查找從對象的方法,以類模塊,以「類」,直到有,方法是在搜索對象self.class時 –

+0

什麼紅寶石做符號查找。祖先,首先爲完全匹配,然後調用'method_missing'-resolvers – Vasfed

+0

順便說一下,'對象'不在層次結構頂部,'BasicObject'是 – Vasfed