Ruby變量中的實例變量
實例變量以at sign(@)開頭,只能在類方法中引用。它們與局部變量的不同之處在于它們不存在于任何特定范圍內。相反,為類的每個實例存儲一個類似的變量表。實例變量存在于類實例中,只要該實例保持活動狀態(tài),實例變量也是如此。
實例變量可以在該類的任何方法中引用。一個類的所有方法都使用相同的實例變量表,而不是每個方法將具有不同變量表的局部變量。但是,可以在不首先定義實例變量的情況下訪問實例變量。這不會引起異常,但變量's值將零,如果您've使用-w開關運行Ruby,將發(fā)出警告。
這個例子演示了實例變量的使用。請注意,shebang包含-w開關,如果發(fā)生警告,將打印警告。另外,請注意類范圍內方法之外的錯誤用法。這是不正確的,下面討論。
為什么@test變量不正確?這與范圍以及Ruby如何實現(xiàn)事物有關。在一個方法中,實例變量范圍指的是該類的特定實例。但是,在類范圍內(在類內部,但在任何方法之外),范圍是類實例范圍。Ruby通過實例化class對象來實現(xiàn)類層次結構,因此這里有一個第二個實例。第一個實例是ClassClass的實例,這是@test將去的地方。第二個實例是TestClass的實例化,這是@value將去的地方。這有點令人困惑,但請記住,不要在方法之外使用@實例變量。如果您需要類范圍的存儲,請使用@@@@@class?variables,這可以是在類范圍內的任何地方(方法內部或外部)使用,并且行為相同。
Accessors
您通常無法從對象外部訪問實例變量。例如,在上面的示例中,您不能簡單地調用t.value或t.@value來訪問實例變量@value。這將打破封裝的規(guī)則。這也適用于子類的實例,它們不能訪問屬于父類的實例變量,即使它們在技術上是相同的類型。因此,為了提供對實例變量的訪問,必須聲明accessor方法。
以下示例演示了如何編寫訪問方法。但是,請注意,Ruby提供了一個快捷方式,并且此示例僅用于顯示accessor方法的工作方式。除非加入者需要某種額外的邏輯,否則通常不會看到以這種方式編寫的加入方法。
快捷方式使事情變得更容易和更緊湊。有三種輔助方法。它們必須在類范圍內運行(在類內部但在任何方法之外),并且將動態(tài)定義方法,就像上面示例中定義的方法一樣。這里沒有魔術,它們看起來像語言關鍵字,但它們實際上只是動態(tài)定義方法。而且,這些加入者通常排在班級的首位。這為讀者提供了一個即時的概述,哪些成員變量將在類外或子類中可用。
有三種加入方法。他們每個人都有一個描述要訪問的實例變量的符號列表。
- attr?reader-Define"reader"方法,例如上述示例中的name方法。
- attr?writer-Define"writer"方法,例如上面的age=方法示例。
- attr?accessor-定義"閱讀器"和"寫入器"方法。
何時使用實例變量
現(xiàn)在你知道什么樣的實例變量,你什么時候使用它們?當它們表示對象的狀態(tài)時,應該使用實例變量。學生'姓名和年齡,成績等。他們不應該't用于臨時存儲,即's本地變量用于什么。但是,它們可能會用于多階段計算的方法調用之間的臨時存儲。但是,如果您這樣做,您可能需要重新考慮您的方法組成,并將這些變量轉換為方法參數(shù)。
水果與健康知識