跳轉到內容

Ruby 程式設計/參考/物件/Struct

來自 Wikibooks,開放世界中的開放書籍

結構 (Struct) 是一個

  • 資料容器,一種方便的方式將多個屬性捆綁在一起,而無需編寫顯式的類。
  • 命名資料集合(變數集),表示單個想法或物件。

在“結構”內部,有一個欄位列表 - 例如

  • 聯絡人:名,姓,電話,電子郵件,生日。
  • 地址:街道,城市,州,地區,郵政編碼,GPS 位置/座標。

結構類似於陣列,因為它們包含多個數據。但是,我們不是使用每個資料片的索引,而是使用變數“名稱”。使用上面的示例

  • 結構(資料集合)= 聯絡人
  • 結構“聯絡人”中的第一個欄位是“名”

Struct 可在無需任何其他 require 語句的情況下使用。

建立結構

[編輯 | 編輯原始碼]

在 Ruby 中,Struct.new 將一組欄位名稱作為引數,並返回一個新的類。

Newtype = Struct.new(:data1, :data2)
n = Newtype.new  # => <struct Newtype data1=nil, data2=nil>

類 Struct 具有一個方法 new,就像其他類一樣。但是該方法不會返回 Struct 的例項,而是返回一個類,該類是類 Struct 的子類。例如

pnt = Struct.new(:x, :y)    # => #<Class:0x143ce50>
pnt.ancestors #=> [#<Class:0x143d6f0>, Struct, Enumerable, Object, Kernel, BasicObject]

Struct.new 的引數是生成的類將具有的欄位名稱。這些名稱必須以符號的形式提供。

  1. 方法/方式 1
Struct.new("Point", :x, :y) #=> Struct::Point
origin = Struct::Point.new(0,0)  # #<struct Struct::Point x=0, y=0>
  1. 方法/方式 2
Structure_example = Struct.new(:filed1, :field2, :field3)
se = Structure_example.new("abc", "xyz", 123)    => #<struct Structure_example filed1="abc", field2="xyz", field3=123>

Struct::new 返回一個新的類物件,然後可以使用該物件建立新結構的特定例項。實際引數的數量必須小於或等於為該類定義的屬性數量;未設定的引數預設為 nil。傳遞過多的引數將引發 ArgumentError。

更改結構值

[編輯 | 編輯原始碼]
se[:field3] = 456

列印結構值和成員

[編輯 | 編輯原始碼]
p se    => #<struct Structure_example filed1="abc", field2="xyz", field3=456>
p se.values    => ["abc", "xyz", 456]
p se.members   => [:field1, :field2, :field3]

比較結構

[編輯 | 編輯原始碼]
Customer = Struct.new(:name, :address)
joe1   = Customer.new("Joe", "adr1")
joe2 = Customer.new("Joe", "adr1")
jane  = Customer.new("Jane", "adr2")
joe1 == joe2      #=> true
joe1.eql?(joe2)   #=> true
joe1.equal?(joe2) #=> false
joe1 == jane      #=> false
print joe1[:name], joe1["name"], joe1[0] # same result in each case  -   => "Joe"

請參閱 Struct 的 rdoc。在此處新增任何其他示例/教程。

華夏公益教科書