2013-01-10 34 views
2

假設我編寫了一個沒有類定義的Ruby腳本。我仍然可以創建類變量和類級別實例變量:Ruby中的「頂級上下文對象」就像JavaScript中的全局上下文一樣嗎?

@@var = "class variable!"; 
@var = "class instance variable!"; 

puts @@var; 
puts @var; 

這些變量屬於頂級上下文對象。

這個頂級上下文對象與global context in JavaScript類似,它可以作爲一種頂級命名空間嗎?例如,有沒有辦法在Ruby中使用「頂級上下文對象」來做這樣的事情?

var arrStore1 = new Ext.data.ArrayStore({/*...*/}); 
/* same call again, using the global context object */ 
var global = window; 
var arrStore2 = new global.Ext.data.ArrayStore({/*...*/}); 
+0

你可以但可能不應該。主環境不應該被這種方式用實例變量污染。 – tadman

+0

@tadman - 我問更多它是否作爲根名稱空間行爲,這將允許訪問使用該變量的其他類; 'self.Dir.pwd'什麼的。 –

+0

'self.Dir'應該不起作用。 Dir是一個根名稱空間條目,就像任何其他類一樣。一般情況下,實例變量用於類和類的實例* only *。看到他們用於其他目的非常不規範。 JavaScript與Ruby有不同的上下文和範圍界定。另外,'@ var'對於根名稱空間來說是私有的,其他人不能訪問,因爲實例變量總是對其所有者是私有的。 – tadman

回答

2

頂級對象就像任何其他紅寶石對象。你可以包含模塊,它可以有實例變量。但這不是一個真正的全球背景。

有關更多詳細信息,請參閱SO:What is "main" in Ruby?

1

它幾乎總是最好創建某種類型的頂級命名空間的條目,並把您的全球或準全局變量有:

module GlobalOptions 
    def self.option 
    @option 
    end 

    def self.option=(value) 
    @option = value 
    end 
end 

GlobalOptions.option = :foo 
GlobalOptions.option 
# => :foo 

裏面的Rails你有mattr_accessor可以自動生成這些。

相關問題