2012-07-15 36 views
21

Ruby有5個可變範圍:差異紅寶石作用域

  1. 本地變量:這些是正常的變量,例如x = 25y = gaurish其中xy是局部變量。
  2. 實例變量:這些用實際變量名稱的@符號表示。主要與類一起使用,以便類的每個實例/對象具有不同的/單獨的值。例。 @employee.name = 'Alex'
  3. 類別變量:用變量名前面的@@符號表示。類變量,我認爲具有相同的價值accos所有實例/對象。
  4. 全局變量:他們開始與$符號和可訪問到處。示例$LOAD_PATH
  5. 常量:必須以大寫字母開始,但以大寫字母ALL_CAPS寫。雖然,它是一個常量,但它的價值不是恆定的,可以改變(雖然紅寶石會發出警告)。所以從某種意義上講,這也是一個變量。

正如你可能會注意到的,以上所有的變量都存儲某種類型的值,並且它們的值可以被改變。但是,每個範圍都有一點不同。有5種不同類型的可變範圍會讓我感到困惑。主要是,我很難決定在什麼情況下,我應該在我的代碼中使用特定範圍。所以我在腦海裏有一些問題。請回答:

  1. 我注意到局部變量和類變量對所有對象/實例保持不變,與實例變量不同。那麼局部變量和類變量有什麼區別?
  2. 局部變量可以用來代替類變量嗎?或相反亦然。如果是,那麼爲什麼,如果不是,那爲什麼不呢?
  3. Ruby中的全局變量讓我想起了PHP中的邪惡global $x變量。 Ruby中的全局變量也被認爲是邪惡的,因此不應該被使用。或者,在某些情況下,在ruby中使用全局變量是有意義的?
  4. 爲什麼常量不是常量並且允許改變它們的值?定義中的常數值應該是正確的?否則,我們可以使用另一個變量並且不要更改它的值。這會相當於紅寶石中的CONSTANT嗎?
  5. 解釋ruby中5個不同變量作用域之間區別的任何頁面/資源/鏈接?我喜歡保留一個方便參考。
  6. 在什麼用例下,我應該在我的代碼中使用特定的變量作用域。所以可以解釋所有5例可能會很酷的例子,這是我混淆的主要原因。
  7. 在java中是否有像public這樣的事實選擇?在大多數使用情況下,哪個安全下注?

感謝您抽出時間來閱讀和回答問題

+0

對於第一點,所有對象共享類級變量,每個單獨的對象將有自己的局部變量副本 – 2012-07-15 20:01:12

+0

如果每個單獨的對象都有自己的局部變量副本,那麼不是局部變量更像是實例變量然後? – CuriousMind 2012-07-15 20:02:53

+1

排序,我想你可以這樣看他們。實例變量_屬於一個對象的實例,通常構成該對象的屬性。例如'Person'對象可能有兩個實例變量'@ first_name'和'@ last_name',它也可能有一個局部變量'x',但'x'與'Person'對象的狀態無關 – 2012-07-15 20:06:32

回答

10
  1. 類變量是所有實例是相同的,因爲他們是類變量–與類相關。一切都訪問相同的變量,包括每個實例。

  2. 不。局部變量只是–本地。它們可能是本地的一個功能,或者是本地的類別聲明,這是不同比作爲類變量。當類聲明結束時,類聲明中的局部變量超出範圍。

  3. 這是因爲他們是完全一樣的–他們是全球性的。全局狀態是總是邪惡;這不是語言或環境的屬性。也就是說,一些全局狀態可能需要–這就是它的方式。有全局狀態時使用全局狀態是有意義的。訣竅是使用全局狀態正確,這有時是一個不平凡的努力。

  4. 這就是Ruby是如何。

  5. Chris已經給出了一個。

  6. 我會認爲這個問題很大程度上會自我回答。全球當全世界需要訪問時。實例,當它是特定於類實例時。只在本地範圍內需要本地(例如,方法,塊(注意區塊範圍在1.8和1.9之間的區別)等)。當變量不應該改變時爲常量。一個類變量,當它是每個實例需要的東西時,或者如果通過類方法暴露,則是與類緊密關聯的東西。

  7. 沒有「最多用例」,它完全取決於你對變量做什麼。並且public不是Java –中的事實選擇,它取決於所討論的實體。默認的Java範圍是包私有的(方法,屬性)。在Ruby中使用哪一個完全取決於用例,注意到與Java一樣,在Ruby中更容易,事情可以繞開。

5

局部變量是不等同於階級的人,他們是綁你是在塊,任何地方在一個塊中聲明可以在那裏使用。類變量與你所處的類結構有關。定義一個類本身就是一個塊,所以你可能能夠類似地訪問局部變量,但是你會發現如果你在不同的上下文中引用你的類,你不能引用局部變量以相同的方式。

如果濫用,全局變量被認爲是不好的形式。 OOP應該幫助你構建你的程序,使整個程序的常量不再需要。認爲它們實際上是全球化的:如果你不能保證它與整個世界的一致性,比如PI的價值,或者你是否愛你的妻子,那麼你可能不應該承諾。

一旦你掌握了它們,我發現「Ruby Variable Scope」是一個很好的參考。

2

我在下面的鏈接中找到了關於Ruby中不同範圍和可見性的很好和深入的解釋。 Scopes and Visibilities with Examples in detail.

根據它,

Class variable (@@a_variable): Available from the class definition and any sub-classes. Not available from anywhere outside. 

Instance variable (@a_variable): Available only within a specific object, across all methods in a class instance. Not available directly from class definitions. 

Global variable ($a_variable): Available everywhere within your Ruby script. 

Local variable (a_variable): It is available only in the particular method or block in ruby script. 

關於實例變量一些更多的解釋是:您可以在特定類的任何方法訪問實例變量。雖然局部變量不能在方法外訪問。下面是一個從ruby和尚中徹底解釋這個概念的例子。

class Item 

    def initialize(item_name, quantity) 

     @item_name = item_name 
     @quantity = quantity 

    end 

    def show 

    puts @item_name 
    puts @quantity 
    supplier = "Acme corp" 
    puts supplier 

    end 
end 

Item.new("tv",1).show 

這裏供應商可以從顯示方法只在我們example.Just試圖聲明供應商變量初始化方法,並打印出來的顯示方法進行訪問的局部變量。它會給未定義的變量提供者一個錯誤。

我希望它有幫助。 :)

1

這裏是我的兩分錢,這和正在撰寫的C++/JAVA/C#程序員:

Ruby的本地/ $全局變量有點像C++/JAVA/C#的局部/全局變量。

Ruby @instance變量它就像C++/java/c#的成員變量/類屬性,可以在任何成員函數/類方法中訪問。儘管Ruby實例不僅可以應用於類,還可以應用於Ruby模塊。

Ruby @@ class變量就像C++/java的靜態成員變量,它在同一個類的所有實例之間共享。