2016-11-27 74 views
2

所以我學到的是,當我在對象上調用變量時,Ruby實例變量是否具有訪問修飾符?

my_object.variable 

的方法稱爲variable正在返回的variable

def variable 
    @variable 
end 

值在Java中,有訪問修飾符。如果getter方法以其變量命名,Ruby如何使用訪問修飾符?

回答

7

首先,在回答問題之前,有一些術語需要清理。

一個是你永遠不會「調用」變量。 Ruby的表達

my_object.variable 

方法調用。沒有可變電話這樣的事情。你調用方法,而不是變量。即使該方法被命名爲variable。 :)

第二個是如果你沒有這樣定義的方法,這

def variable 
    @variable 
end 

直接或說

attr_reader :variable 

然後你有一個名爲variable方法和一個名爲@variable變量。

現在回答這個問題。

紅寶石地方訪問修飾符publicprotected,只有private的方法,並且不變量。對變量的訪問控制實際上並不合理,因爲它們只能在對象的方法中引用,並且從不帶前綴!換句話說,你永遠不會寫這個:

[email protected] 

這只是一個語法錯誤。你可以寫

obj.var 

其中var是一個方法的名稱。訪問控制僅適用於該方法。

事實上,您可能正在製作具有相同名稱的變量和方法(@除外)實際上並不重要。只有方法具有訪問控制。

希望能幫助澄清一些可以理解的困惑!

+0

謝謝。當我執行'my_object.variable'時,我可以在Java中說「調用變量」嗎?我明白爲什麼我不能在Ruby中。 –

+1

如果您將「呼叫」表示爲「訪問」,那麼是的,大多數人都會理解。但鑑於我們通常所說的「函數調用」和「方法調用」,在談到變量時最好避免使用該術語。但是人們會在Java中理解你,儘管我認爲「訪問」或「讀取」對變量更好。你調用方法,但讀取變量。正如你注意到的,你真的不能用Ruby來說。 :) Ruby和Java在這裏確實非常不同。 –

+0

從技術上講,實例變量屬於對象(又名實例),而不屬於類。一個實例變量不能從另一個*對象*中看到,而不是一個不同的類。 (例如,可以從子類或超類的方法中看到)。 –

2

有幾種方法可以使方法在Ruby中是私有的。

使用private讓所有後來的方法私:

class Foo 
    def public_method 
    end 

private 

    def private_method 
    end 
end 

或製作方法私人你定義後:

class Foo 
    def public_method 
    end 

    private :public_method # public_method is now private 
end 

或者 - 因爲該方法的定義返回一個符號太多 - 這也作品:

class Foo 
    private def method_name 
    end 
end