Ruby變量中的實(shí)例變量

實(shí)例變量以at sign(@)開頭,只能在類方法中引用。它們與局部變量的不同之處在于它們不存在于任何特定范圍內(nèi)。相反,為類的每個(gè)實(shí)例存儲(chǔ)一個(gè)類似的變量表。實(shí)例變量存在于類實(shí)例中,只要該實(shí)例保持活動(dòng)狀態(tài),實(shí)例變量也是如此。

實(shí)例變量可以在該類的任何方法中引用。一個(gè)類的所有方法都使用相同的實(shí)例變量表,而不是每個(gè)方法將具有不同變量表的局部變量。但是,可以在不首先定義實(shí)例變量的情況下訪問實(shí)例變量。這不會(huì)引起異常,但變量's值將,如果您've使用-w開關(guān)運(yùn)行Ruby,將發(fā)出警告。

這個(gè)例子演示了實(shí)例變量的使用。請(qǐng)注意,shebang包含-w開關(guān),如果發(fā)生警告,將打印警告。另外,請(qǐng)注意類范圍內(nèi)方法之外的錯(cuò)誤用法。這是不正確的,下面討論。

為什么@test變量不正確?這與范圍以及Ruby如何實(shí)現(xiàn)事物有關(guān)。在一個(gè)方法中,實(shí)例變量范圍指的是該類的特定實(shí)例。但是,在類范圍內(nèi)(在類內(nèi)部,但在任何方法之外),范圍是類實(shí)例范圍。Ruby通過實(shí)例化class對(duì)象來實(shí)現(xiàn)類層次結(jié)構(gòu),因此這里有一個(gè)第二個(gè)實(shí)例。第一個(gè)實(shí)例是ClassClass的實(shí)例,這是@test將去的地方。第二個(gè)實(shí)例是TestClass的實(shí)例化,這是@value將去的地方。這有點(diǎn)令人困惑,但請(qǐng)記住,不要在方法之外使用@實(shí)例變量。如果您需要類范圍的存儲(chǔ),請(qǐng)使用@@@@@class?variables,這可以是在類范圍內(nèi)的任何地方(方法內(nèi)部或外部)使用,并且行為相同。

Accessors

您通常無法從對(duì)象外部訪問實(shí)例變量。例如,在上面的示例中,您不能簡單地調(diào)用t.valuet.@value來訪問實(shí)例變量@value。這將打破封裝的規(guī)則。這也適用于子類的實(shí)例,它們不能訪問屬于父類的實(shí)例變量,即使它們?cè)诩夹g(shù)上是相同的類型。因此,為了提供對(duì)實(shí)例變量的訪問,必須聲明accessor方法。

以下示例演示了如何編寫訪問方法。但是,請(qǐng)注意,Ruby提供了一個(gè)快捷方式,并且此示例僅用于顯示accessor方法的工作方式。除非加入者需要某種額外的邏輯,否則通常不會(huì)看到以這種方式編寫的加入方法。

快捷方式使事情變得更容易和更緊湊。有三種輔助方法。它們必須在類范圍內(nèi)運(yùn)行(在類內(nèi)部但在任何方法之外),并且將動(dòng)態(tài)定義方法,就像上面示例中定義的方法一樣。這里沒有魔術(shù),它們看起來像語言關(guān)鍵字,但它們實(shí)際上只是動(dòng)態(tài)定義方法。而且,這些加入者通常排在班級(jí)的首位。這為讀者提供了一個(gè)即時(shí)的概述,哪些成員變量將在類外或子類中可用。

有三種加入方法。他們每個(gè)人都有一個(gè)描述要訪問的實(shí)例變量的符號(hào)列表。

  • attr?reader-Define"reader"方法,例如上述示例中的name方法。
  • attr?writer-Define"writer"方法,例如上面的age=方法示例。
  • attr?accessor-定義"閱讀器"和"寫入器"方法。

何時(shí)使用實(shí)例變量

現(xiàn)在你知道什么樣的實(shí)例變量,你什么時(shí)候使用它們?當(dāng)它們表示對(duì)象的狀態(tài)時(shí),應(yīng)該使用實(shí)例變量。學(xué)生'姓名和年齡,成績等。他們不應(yīng)該't用于臨時(shí)存儲(chǔ),即's本地變量用于什么。但是,它們可能會(huì)用于多階段計(jì)算的方法調(diào)用之間的臨時(shí)存儲(chǔ)。但是,如果您這樣做,您可能需要重新考慮您的方法組成,并將這些變量轉(zhuǎn)換為方法參數(shù)。

水果與健康知識(shí)

教育_1