结构体类。由Struct.new生成该类的子类。在子类中使用new方法就可以生成构造体。构造体子类中定义了构造体成员的访问方法。
Struct.new([name,] member ... )生成并返回一个名为name的Struct 类的子类。子类中定义了访问结构体成员的方法。例如:
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"。
结构体名name将成为Struct的类常数名,所以必须以大写字母开始。member可以是Symbol或字符串。
若第一参数为字符串的话,它将被当作类名来处理,因此会出现下列错误。所以最好使用Symbol来指定结构体成员。
p Struct.new('foo', 'bar')
# => -:1:in `new': identifier foo needs to be constant (NameError)
若省略name(第一参数为Symbol)时,就会生成无名的结构体类。当首次要求无名类提供其类名时,它会搜索被赋值的常数名,若找到的话就以该常数名为类名(请参考Class.new)。
例: 结构体类的类名
p Struct.new("Foo", :foo, :bar)
=> Struct::Foo
p Foo = Struct.new(:foo, :bar)
=> Foo
Struct::XXX.new(value,...)Struct::XXX[value,...]生成并返回结构体对象。参数将成为结构体的初始值。若参数的数量超过构造体成员的数量时,将引发ArgumentError异常。若没有为成员指定初始值时,其值为nil。
Foo = Struct.new(:foo, :bar) foo = Foo.new(1) p foo.values # => [1, nil]
Struct::XXX.members以数组的形式返回结构体成员名(字符串)。
Foo = Struct.new(:foo, :bar) p Foo.members # => ["foo", "bar"]
self[nth]返回结构体的第nth个成员的值。若nth是字符串或Symbol的话,将返回同名成员的值。
若指定了并不存在的成员时,会引发IndexError或NameError异常。
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)
self[nth]=value将结构体的第nth个成员的值设定为value,并返回value值。若nth是字符串或Symbol时,就将同名成员的值设为value。
若指定了并不存在的成员时,会引发IndexError或NameError异常。
each {|value| ... }依次对结构体的各个成员进行迭代操作。
返回self。
each_pair {|member, value| ... } ((<ruby 1.7 特性>))在结构体中,依次将某成员的名称(Symbol)和值传给块进行迭代操作。
返回self。
Foo = Struct.new(:foo, :bar)
Foo.new('FOO', 'BAR').each_pair {|m, v| p [m,v]}
# => [:foo, "FOO"]
[:bar, "BAR"]
lengthsize返回结构体的成员数量。
members以数组形式返回结构体的成员名(字符串)。
Foo = Struct.new(:foo, :bar) p Foo.new.members # => ["foo", "bar"]
valuesto_a将结构体的成员的值存入数组,并返回它。例如,下面的代码可以输出passwd的entry(请参考etc.so)。
require 'etc'
print Etc.getpwuid.values.join(":"), "\n"
values_at(member_1, ... member_n)ruby 1.8 特性
以数组的形式返回参数(数值、字符串或Symbol)所指成员的值。若指定了并不存在的成员时,会引发IndexError或NameError异常。
Foo = Struct.new(:foo, :bar, :baz)
obj = Foo.new('FOO', 'BAR', 'BAZ')
p obj.values_at(0, :bar, 'baz') # => ["FOO", "BAR", "BAZ"]