Ruby 3.2 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Dataクラス > []
new(*args) -> Data
[permalink][rdoc]new(**kwargs) -> Data
self[*args] -> Data
self[**kwargs] -> Data
(このメソッドは Data のサブクラスにのみ定義されています) 値オブジェクトを生成して返します。
Point = Data.define(:x, :y)
p1 = Point.new(1, 2)
p p1.x # => 1
p p1.y # => 2
p2 = Point.new(x: 3, y: 4)
p p2.x # => 3
p p2.y # => 4
new に渡す引数の数がメンバの数より多い場合は new でエラーになります。
new に渡す引数の数がメンバの数より少ない場合は new ではエラーにならず、そのまま initialize に渡されます。ユーザが initialize のオーバーライドを通して、少ない引数のときの適切な振舞いを実装可能とするためです。
次の例ではいずれのケースでもエラーが発生していますが、 Point.new に渡した位置引数の数が多い場合(上から2番目)のみ new でエラーが発生しており、残りのケースではエラーの発生箇所は new ではなく initialize であることに注意してください。
Point = Data.define(:x, :y)
Point.new(1) # => in `initialize': missing keyword: :y (ArgumentError)
Point.new(1, 2, 3) # => in `new': wrong number of arguments (given 3, expected 0..2) (ArgumentError)
Point.new(x: 1) # => in `initialize': missing keyword: :y (ArgumentError)
Point.new(x: 1, y: 2, z: 3) # => in `initialize': unknown keyword: :z (ArgumentError)
下の例のように、initialize メソッドをオーバーライドすることで new のオプション引数を実現できます。
Point = Data.define(:x, :y) do
def initialize(x:, y: 0)
super
end
end
Point.new(x: 1) # => #<data Point x=1, y=0>
Point.new(x: 1, y: 2) # => #<data Point x=1, y=2>
メンバに存在しない引数を受け取るようにすることもできます。
Point = Data.define(:x, :y) do
def initialize(x:, y:, multiplier: 1)
super(x: x * multiplier, y: y * multiplier)
end
end
Point.new(x: 1, y: 2) # => #<data Point x=1, y=2>
Point.new(x: 1, y: 2, multiplier: 10) # => #<data Point x=10, y=20>