Struct对象

结构体类 Struct 是将许多属性 (atributes) 捆绑在一起的方便途径,可以使用存取器方法,而不必直接写一个类。 Struct 类是一个指定类集的生成器,它的每个子类都被定义为持有一组变量和它们的存取器。

 

也就是说, Struct.new 方法能生成 Struct 类的子类。在子类中使用 new 方法就可以生成构造体。而构造体的子类中定义了构造体成员的访问方法。

 

在下面这些例子中,我们将调用被创建的类 ”Customer” ,然后我们显示它的一个名为 joe 的实例。此外参数 symbol 引用一个符号,它即可以是个引用字符串也可以是一个 Symbol 对象,如 :name

有時候只是想要把一些資料封裝在一起, 但用到 class 實在是不太需要, 可以考慮換用 Struct 方法.
  1. Struct.new([Name,] member …), 會產生一個 “Name” 的 class
    
    NameCard = Struct.new("NameCard", :name, :age);
    puts NameCard.class
    
    
    
    
  2. 使用之前產生的 “Name” class, 你可以 new, 然後存取或寫入.
    
    a = NameCard.new("Andrew", 10)
    puts a.inspect
    
    a.age = a.age + 1;
    puts a.inspect
    
    
    
    

 

 

 

Struct 的超类是 Object ,它包含了模块 Enumerable

 

类方法:

(1) Struct.new( [aString] [, aSym]+> ) => StructClass 生成并返回一个名为 aStringStruct 类的子类,子类中定义了访问结构体成员的方法。

dog = Struct.new("Dog", :name, :age)

fred = dog.new("fred", 5)

fred.age=6

printf "name:%s age:%d", fred.name, fred.age #=>”name:fred age:6”

 

如果忽略名字 aString ,则将创建一个匿名 Struct 类的子类。否则,这个结构体的名字将作为 Struct 类内的一个常量名出现。因此,对于系统内的所有结构体来说它的名字必须是唯一的且以在写字母开头。 当首次要求无名类提供其类名时,它会搜索被赋值的常数名,若找到的话就以该常数名为类名 ( 请参考 Class.new )

例:结构体类的类名:

p Struct.new("Foo", :foo, :bar) #=> Struct::Foo

p Foo = Struct.new(:foo, :bar) #=> Foo

 

aSym 可以是 Symbol 对象或字符串。此外,若 aString 为字符串话,它会被当作类名来处理,因此可以会出现错误。所以最好使用 Symbol 来指定结构体的成员。

 

结构体类的类方法:

(1)StructClass.new(arg, ...) => obj StructClass[arg, ...] => obj Struct::new 返回一个新的 Class 对象,随后它可被用于创建指定新结构体的实例。即生成并返回结构体对象。参数将成为结构体的初始值。实际参数的数量必须小于或等于这个类定义时的属性数量;没有指定成员初始值是,成员的值被设为 nul{} 。若传递的参数多了将引起 ArgumentError 异常。

例如:

Foo = Struct.new(:foo, :bar)

foo = Foo.new(1)

p foo.values # => [1, nil]

 

再如:

# 创建有名称的 Struct 类的子类 Customer

# => Struct::Customer

Struct.new("Customer", :name, :address)

 

# 创建 Customer 结构体的实例 Dave

#=> #Main">

Struct::Customer.new("Dave", "123 Main")

 

# 使用结构体的常量名创建实例。

#=> Customer

Customer = Struct.new(:name, :address)

#=> #Main">

Customer.new("Dave", "123 Main")

 

(2) struct.members => array 以数组的形式返回结构体成员名 ( 字符串 )

例如 :

Foo = Struct.new(:foo, :bar)
       p Foo.members # => ["foo", "bar"]

 

         Customer = Struct.new( "Customer", :name, :address, :zip )

Customer.members #-> ["name", "address", "zip"]

 

实例方法:

(1) struct[symbol] => anObject struct[fixnum] => anObject 属性引用 返回名为 symbol 实例变量的值,或者由 fixnum 编写的索引 (0..length-1) 。也就是说,是返回结构体的第 nth(0..length-1) 个成员的值。若 symbol 不是 nth 而是字符串或 Symbol 对象的话,将返回同名成员的值。若指定了并不存在的成员变量,会引发 NameError 或当索引超出范围时引发 IndexError 异常。

例如:

Customer = Struct.new(:name, :address, :zip)




joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)




joe["name"]   


#=> "Joe Smith"




joe[:name]    


#=> "Joe Smith"






joe[0] 


#=> "Joe Smith"


再如:






Foo = Struct.new(:foo, :bar)


obj = Foo.new('FOO', 'BAR')


p obj[:foo] 


# => "FOO"


p obj['bar'] 


# => "BAR"


# p obj[:baz] 




# => in `[]': no member 'baz' in struct (NameError)


p obj[0] 


# => "FOO"


p obj[1] 


# => "BAR"


p obj[-1] 


# => "BAR"


# 





Array

一样,可以使用负的索引值。






p obj[2] 




# => in `[]': offset 2 too large for struct(size:2) (IndexError)

 

(2) struct[symbol] = obj => obj struct[fixnum] = obj => obj 属性赋值 symbol 指向的成员变量或 fixnum 索引的值赋 obj 值并返回它。即是,将结构体的第 nth 个成员的值设置为 obj ,并返回 obj 的值。若不是 fixnum 而是字符串或 Symbol 对象时,就将同名成员的值设为 obj 。若指定了并不存在的成员变量,会引发 NameError 或当索引超出范围时引发 IndexError 异常。

例如:

Customer = Struct.new(:name, :address, :zip)

joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)

joe["name"] = "Luke"

joe[:zip] = "90210"

joe.name #=> "Luke"

joe.zip #=> "90210"

 

(3) struct.each {|obj| block } => struct 为每个实例变量调用一次 block 块,并做为参数传递这个值。即,依次对结构体的各个成员进行迭代操作。返回 self

例如:

Customer = Struct.new(:name, :address, :zip)

joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)

joe.each {|x| puts(x) }

 

produces: Joe Smith

123 Maple, Anytown NC

12345

(4) struct.each_pair {|sym, obj| block } => struct 为每个实例变量调用一次 block 块,传递名字 (Symbol 对象 ) 和值做为参数。即,在结构体中,依次将某成员的名称 (Symbol) 和值传递给 block 块进行迭代。返回 self

例如:

Customer = Struct.new(:name, :address, :zip)

joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)

joe.each_pair {|name, value| puts("#{name} => #{value}") }

 

produces: name => Joe Smith

address => 123 Maple, Anytown NC

zip => 12345

再如:

Foo = Struct.new(:foo, :bar)

Foo.new('FOO', 'BAR').each_pair {|m, v| p [m,v]}

 

# => [:foo, "FOO"]

[:bar, "BAR"]

 

(5) struct.length => fixnum struct.size => fixnum 返回结构体的成员数量。

例如:

Customer = Struct.new(:name, :address, :zip)

joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)

joe.length #=> 3

 

(6) struct.members => array 以数组形式返回结构体的成员名 ( 字符串 )

例如:

Customer = Struct.new(:name, :address, :zip)





joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)







joe.members 


#=> ["name", "address", "zip"]





 

(7) struct.to_a => array struct.values => array 将结构体的成员的值存入数组,并返回它。

Customer = Struct.new(:name, :address, :zip)





joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)





joe.to_a[1]   


#=> "123 Maple, Anytown NC"








 

(8 ) struct.values_at(selector,... ) => an_array 以数组形式返回参数( 数值、字符串或Symbol 对象) 所指成员的值。selector 即可以是整数也可以是Range 对象。

例如:

a = %w{ a b c d e f }





a.values_at(1, 3, 5)





a.values_at(1, 3, 5, 7)





a.values_at(-1, -3, -5, -7)








a.values_at(1..3, 2...5)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值