Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Structクラス
クラスの継承リスト: Struct < Enumerable < Object < Kernel < BasicObject
構造体クラス。Struct.new はこのクラスのサブクラスを新たに生成します。
個々の構造体はサブクラスから Struct.new を使って生成します。個々 の構造体サブクラスでは構造体のメンバに対するアクセスメソッドが定義され ています。
new(*args) -> ClassStruct クラスに新しいサブクラスを作って、それを返します。
サブクラスでは構造体のメンバに対するアクセスメソッドが定義されています。
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" を出力します
実装の都合により、クラス名の省略は後づけの機能でした。 メンバ名に String を指定できるのは後方互換性のためだと考えた方が良いでしょう。 したがって、メンバ名は Symbol で指定するのが無難です。
args[0] が String の場合、クラス名になるので、大文字で始まる必要 があります。つまり、以下のような指定はエラーになります。
p Struct.new('foo', 'bar')
# => -:1:in `new': identifier foo needs to be constant (NameError)
また args[1..-1] は、Symbol か String で指定します。
p Struct.new("Foo", :foo, :bar) # => Struct::Foo
args[0] が Symbol の場合、生成した構造体クラスは名前の無い クラスになります。名前の無いクラスは最初に名前を求める際に代入され ている定数名を検索し、見つかった定数名をクラス名とします。
Foo = Struct.new(:foo, :bar) p Foo # => Foo
[SEE_ALSO] Class.new
new(*args) -> Structself[*args] -> Struct(このメソッドは Struct の下位クラスにのみ定義されています) 構造体オブジェクトを生成して返します。
Foo = Struct.new(:foo, :bar) foo = Foo.new(1) p foo.values # => [1, nil]
members -> [Symbol](このメソッドは Struct の下位クラスにのみ定義されています) 構造体のメンバの名前(Symbol)の配列を返します。
Foo = Struct.new(:foo, :bar) p Foo.members # => [:foo, :bar]
self == other -> bool自身と other のクラスが同じであり、各メンバが == メソッドで比較して等しい場合に true を返します。そうでない場合に false を返します。
Dog = Struct.new(:name, :age)
dog1 = Dog.new("fred", 5)
dog2 = Dog.new("fred", 5)
p dog1 == dog2 #=> true
p dog1.eql?(dog2) #=> true
p dog1.equal?(dog2) #=> false
[SEE_ALSO] Struct#eql?
self[member] -> object(このメソッドは Struct の下位クラスにのみ定義されています) 構造体のメンバの値を返します。
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[member] = value(このメソッドは Struct の下位クラスにのみ定義されています) 構造体の member で指定されたメンバの値を value にして value を返します。
each {|value| ... } -> selfeach -> Enumerator(このメソッドは Struct の下位クラスにのみ定義されています) 構造体の各メンバに対して繰り返します。
each_pair {|member, value| ... } -> selfeach_pair -> Enumerator(このメソッドは Struct の下位クラスにのみ定義されています) 構造体のメンバ名(Symbol)と値の組を引数にブロックを繰り返し実行します。
Foo = Struct.new(:foo, :bar)
Foo.new('FOO', 'BAR').each_pair {|m, v| p [m,v]}
# => [:foo, "FOO"]
[:bar, "BAR"]
eql?(other) -> bool自身と other のクラスが同じであり、各メンバが eql? メソッドで比較して等しい場合に true を返します。そうでない場合に false を返します。
Dog = Struct.new(:name, :age)
dog1 = Dog.new("fred", 5)
dog2 = Dog.new("fred", 5)
p dog1 == dog2 #=> true
p dog1.eql?(dog2) #=> true
p dog1.equal?(dog2) #=> false
[SEE_ALSO] Struct#==
equal?(other) -> bool指定された other が self 自身である場合のみ真を返します。 これは Object クラスで定義されたデフォルトの動作で す。
[SEE_ALSO] Struct#eql?, Struct#==
hash -> Integer自身が保持するメンバのハッシュ値を元にして算出した整数を返します。 自身が保持するメンバの値が変化すればこのメソッドが返す値も変化します。
Dog = Struct.new(:name, :age)
dog = Dog.new("fred", 5)
p dog.hash #=> 7917421
dog.name = "john"
p dog.hash #=> -38913223
length -> Fixnumsize -> Fixnum(このメソッドは Struct の下位クラスにのみ定義されています) 構造体のメンバの数を返します。
members -> [String](このメソッドは Struct の下位クラスにのみ定義されています) 構造体のメンバの名前(文字列)の配列を返します。
Foo = Struct.new(:foo, :bar) p Foo.new.members # => ["foo", "bar"]
values -> [object]to_a -> [object](このメソッドは Struct の下位クラスにのみ定義されています) 構造体のメンバの値を配列にいれて返します。
例えば以下のようにして passwd のエントリを出力できます。
require 'etc'
print Etc.getpwuid.values.join(":"), "\n"
values_at(*members) -> [object](このメソッドは Struct の下位クラスにのみ定義されています) 引数で指定されたメンバの値の配列を返します。
Foo = Struct.new(:foo, :bar, :baz)
obj = Foo.new('FOO', 'BAR', 'BAZ')
p obj.values_at(0, 1, 2) # => ["FOO", "BAR", "BAZ"]