Struct

结构体类。由Struct.new生成该类的子类。在子类中使用new方法就可以生成构造体。构造体子类中定义了构造体成员的访问方法。

超类:

包含的模块:

类方法:

Struct.new([name,] member ... )

生成并返回一个名为nameStruct 类的子类。子类中定义了访问结构体成员的方法。例如:

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的话,将返回同名成员的值。

若指定了并不存在的成员时,会引发IndexErrorNameError异常。

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

若指定了并不存在的成员时,会引发IndexErrorNameError异常。

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"]
length
size

返回结构体的成员数量。

members

以数组形式返回结构体的成员名(字符串)。

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

将结构体的成员的值存入数组,并返回它。例如,下面的代码可以输出passwd的entry(请参考etc.so)。

require 'etc'
print Etc.getpwuid.values.join(":"), "\n"
values_at(member_1, ... member_n)

ruby 1.8 特性

以数组的形式返回参数(数值、字符串或Symbol)所指成员的值。若指定了并不存在的成员时,会引发IndexErrorNameError异常。

Foo = Struct.new(:foo, :bar, :baz)
obj = Foo.new('FOO', 'BAR', 'BAZ')

p obj.values_at(0, :bar, 'baz')    # => ["FOO", "BAR", "BAZ"]