跳转到内容

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。在此处添加任何其他示例/教程。

华夏公益教科书