## 14.結構和 OpenStruct
好的,在前面的章節中,我們介紹了類,現在讓我們簡單地看一下名為 struct <sup class="footnote">[ [35](#_footnotedef_35 "View footnote.") ]</sup> 的簡單事物。 輸入以下程序并執行
```rb
# struct_start.rb
person = Struct.new :name, :age
p = person.new
p.name = "Karthik"
p.age = 30
puts "Hello, I am #{p.name}, age #{p.age}"
```
輸出量
```rb
Hello, I am Karthik, age 30
```
好了,現在讓我們看看它是如何工作的。 首先,你將使用此語句創建新的`Struct`類型
```rb
Struct.new :name, :age
```
現在,你要命名它,以便可以使用它,將其命名為`person`
```rb
person = Struct.new :name, :age
```
命名后,此變量`person`的作用類似于`class`,你可以像這樣聲明它的新實例
```rb
p = person.new
```
在上面的語句中,`p`是 person 的實例。
現在我們可以使用以下語句分配`p`的`:name`和`:age`
```rb
p.name = "Karthik"
p.age = 30
```
然后你可以打印數據,如下所示
```rb
puts "Hello, I am #{p.name}, age #{p.age}"
```
而已。 在不使用`class`的情況下,你創建了一個數據結構并使用了它! 你不覺得它很棒嗎?
并不是`person = Struct.new :name, :age`中的`person`應該是可變的(即以小寫字母開頭),但是它也可以像`Person`一樣是常量。 這就是這里的下一段代碼中的確切內容
```rb
# struct_constant.rb
Person = Struct.new :name, :age
p = Person.new
p.name = "Karthik"
p.age = 30
puts "Hello, I am #{p.name}, age #{p.age}"
```
Output
```rb
Hello, I am Karthik, age 30
```
所以在這些行中
```rb
Person = Struct.new :name, :age
p = Person.new
```
我們已經將`Person`與大寫字母 P 結合使用,并且代碼有效!
如果你擔心在上一個程序中需要輸入很多字符,可以如下所示將其縮短。 請看下面的代碼。
```rb
# struct_one_line.rb
person = Struct.new :name, :age
p = person.new "Karthik", 30
puts "Hello, I am #{p.name}, age #{p.age}"
```
Output
```rb
Hello, I am Karthik, age 30
```
我們得到相同的輸出,但是在這一行中
```rb
p = person.new "Karthik", 30
```
我們設法消除了這兩條線
```rb
p.name = "Karthik"
p.age = 30
```
如果你注意到正確的話,`p = person.new "Karthik", 30`看起來不是類中的構造函數嗎?
并非`Struct`僅限于其屬性數據結構。 你可以具有一個`Struct`實例可以調用的功能,如下面的程序所示。 輸入并執行。
```rb
include:code/struct_about_me.rb[]
```
Output
```rb
Hello, I am Karthik, age 30
```
如你所見,在 Struct 的`do end`塊之間定義了一個名為`about_me`的函數。 我們在此行`p = person.new "Karthik", 30`中聲明一個人`p`,然后像`puts p.about_me`這樣調用`p`上的`about_me`函數,程序運行正常。 你還必須注意,我們可以將參數傳遞給 struct 中的函數,但是由于我的懶惰,我沒有顯示該示例。
現在讓我們看看如何以錯誤的方式進行結構化。 在下面輸入程序并執行
```rb
# struct_wrong.rb
person = Struct.new :name, :age
p = person.new
p.name = "Karthik"
p.age = 30
p.profession = "Engineer"
puts "Hello, I am #{p.name}, age #{p.age}, and I am on a #{p.profession}"
```
Output
```rb
struct_wrong.rb:7:in `<main>': undefined method `profession=' for #<struct name="Karthik", age=30> (NoMethodError)
```
如果你得到如上所示的輸出,則表明你正確鍵入了該程序。 問題出在`p.profession = "Engineer"`行中,我們正在將數據分配給尚未在結構`person = Struct.new :name, :age`中聲明的名為職業的屬性。 因此會引發錯誤。 為了避免這些事情,你可以使用下面的程序中所示的 Open Struct
```rb
# open_struct.rb
require 'ostruct'
p = OpenStruct.new
p.name = "Karthik"
p.age = 30
puts "Hello, I am #{p.name}, age #{p.age}"
```
Output
```rb
Hello, I am Karthik, age 30
```
Open Struct 類似于 Struct,但是它沒有預定義其數據結構或屬性。
- 前言
- 紅寶石
- 先決條件
- 1.安裝 Ruby
- 2.在線資源
- 3.入門
- 4.比較與邏輯
- 5.循環
- 6.數組
- 7.哈希和符號
- 8.范圍
- 9.功能
- 10.可變范圍
- 11.類&對象
- 12.安全導航
- 13.打破大型程序
- 14.結構和 OpenStruct
- 15. Rdoc
- 16. Ruby 樣式指南
- 17.模塊和混入
- 18.日期和時間
- 19.文件
- 20. Proc,Lambda 和塊
- 21.多線程
- 22.異常處理
- 23.正則表達式
- 24.寶石
- 25.元編程
- 26.基準
- 27.測試驅動開發
- 28.觀察者模式
- 29.模板模式
- 30.工廠模式
- 31.裝飾圖案
- 32.適配器模式
- 33.單例模式
- 34.復合模式
- 35.建造者模式
- 36.策略模式
- 贊助商
- 捐
- 人們怎么說
- 版權
- 取得這本書