Ruby 2.3.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Structクラス
クラスの継承リスト: Struct < Enumerable < Object < Kernel < BasicObject
構造体クラス。Struct.new はこのクラスのサブクラスを新たに生成します。
個々の構造体はサブクラスから Struct.new を使って生成します。個々 の構造体サブクラスでは構造体のメンバに対するアクセスメソッドが定義され ています。
new(*args) -> Class
[permalink][rdoc]new(*args) {|Class| block } -> Class
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" を出力します
実装の都合により、クラス名の省略は後づけの機能でした。 メンバ名に 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
Struct.new にブロックを指定した場合は定義した Struct をコンテキストにブ ロックを評価します。また、定義した Struct はブロックパラメータにも渡さ れます。
Customer = Struct.new(:name, :address) do def greeting "Hello #{name}!" end end Customer.new("Dave", "123 Main").greeting # => "Hello Dave!"
Structをカスタマイズする場合はこの方法が推奨されます。無名クラスのサブ クラスを作成する方法でカスタマイズする場合は無名クラスが使用されなくなっ てしまうことがあるためです。
[SEE_ALSO] Class.new
new(*args) -> Struct
[permalink][rdoc]self[*args] -> Struct
(このメソッドは Struct の下位クラスにのみ定義されています) 構造体オブジェクトを生成して返します。
Foo = Struct.new(:foo, :bar) foo = Foo.new(1) p foo.values # => [1, nil]
members -> [Symbol]
[permalink][rdoc](このメソッドは Struct の下位クラスにのみ定義されています) 構造体のメンバの名前(Symbol)の配列を返します。
Foo = Struct.new(:foo, :bar)
p Foo.members # => [:foo, :bar]
self == other -> bool
[permalink][rdoc]self と 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
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
[SEE_ALSO] Struct#eql?
self[member] -> object
[permalink][rdoc]構造体のメンバの値を返します。
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)
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
self[member] = value
[permalink][rdoc]構造体の member で指定されたメンバの値を value にして value を返します。
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
例:
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"
dig(key, ...) -> object | nil
[permalink][rdoc]self 以下のネストしたオブジェクトを dig メソッドで再帰的に参照して返し ます。途中のオブジェクトが nil であった場合は nil を返します。
klass = Struct.new(:a) o = klass.new(klass.new({b: [1, 2, 3]})) o.dig(:a, :a, :b, 0) # => 1 o.dig(:b, 0) # => nil
[SEE_ALSO] Array#dig, Hash#dig, OpenStruct#dig
each {|value| ... } -> self
[permalink][rdoc]each -> Enumerator
構造体の各メンバに対して繰り返します。
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
例:
Customer = Struct.new(:name, :address, :zip) joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) joe.each {|x| puts(x) } # => Joe Smith # 123 Maple, Anytown NC # 12345
each_pair {|member, value| ... } -> self
[permalink][rdoc]each_pair -> Enumerator
構造体のメンバ名(Symbol)と値の組を引数にブロックを繰り返し実行します。
Foo = Struct.new(:foo, :bar) Foo.new('FOO', 'BAR').each_pair {|m, v| p [m,v]} # => [:foo, "FOO"] [:bar, "BAR"]
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
eql?(other) -> bool
[permalink][rdoc]self と 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
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
[SEE_ALSO] Struct#==
equal?(other) -> bool
[permalink][rdoc]指定された other が self 自身である場合のみ真を返します。 これは Object クラスで定義されたデフォルトの動作で す。
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
[SEE_ALSO] Struct#eql?, Struct#==
hash -> Integer
[permalink][rdoc]self が保持するメンバのハッシュ値を元にして算出した整数を返します。 self が保持するメンバの値が変化すればこのメソッドが返す値も変化します。
Dog = Struct.new(:name, :age) dog = Dog.new("fred", 5) p dog.hash #=> 7917421 dog.name = "john" p dog.hash #=> -38913223
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
inspect -> String
[permalink][rdoc]to_s -> String
self の内容を人間に読みやすい文字列にして返します。
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
例:
Customer = Struct.new(:name, :address, :zip) joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) joe.inspect # => "#<struct Customer name=\"Joe Smith\", address=\"123 Maple, Anytown NC\", zip=12345>"
length -> Integer
[permalink][rdoc]size -> Integer
構造体のメンバの数を返します。
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
例:
Customer = Struct.new(:name, :address, :zip) joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) joe.length #=> 3
members -> [Symbol]
[permalink][rdoc]構造体のメンバの名前(Symbol)の配列を返します。
Foo = Struct.new(:foo, :bar)
p Foo.new.members # => [:foo, :bar]
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
select {|i| ... } -> [object]
[permalink][rdoc]select -> Enumerator
構造体のメンバの値に対してブロックを評価した値が真であった要素を全て含 む配列を返します。真になる要素がひとつもなかった場合は空の配列を返しま す。
ブロックを省略した場合は、各要素に対しブロックを評価し 真になった値の配 列を返すような Enumerator を返します。
Lots = Struct.new(:a, :b, :c, :d, :e, :f) l = Lots.new(11, 22, 33, 44, 55, 66) l.select {|v| (v % 2).zero? } #=> [22, 44, 66]
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
[SEE_ALSO] Enumerable#select
values -> [object]
[permalink][rdoc]to_a -> [object]
構造体のメンバの値を配列にいれて返します。
例えば以下のようにして passwd のエントリを出力できます。
require 'etc' print Etc.getpwuid.values.join(":"), "\n"
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
to_h -> Hash
[permalink][rdoc]self のメンバ名(Symbol)と値の組を Hash にして返します。
Customer = Struct.new(:name, :address, :zip)
Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345).to_h
# => {:name=>"Joe Smith", :address=>"123 Maple, Anytown NC", :zip=>12345}
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。
values_at(*members) -> [object]
[permalink][rdoc]引数で指定されたメンバの値の配列を返します。
Foo = Struct.new(:foo, :bar, :baz) obj = Foo.new('FOO', 'BAR', 'BAZ') p obj.values_at(0, 1, 2) # => ["FOO", "BAR", "BAZ"]
[注意] 本メソッドの記述は Struct の下位クラスのインスタンスに対して呼び 出す事を想定しています。Struct.new は Struct の下位クラスを作成する点に 注意してください。