singleton method Data.[]

new(*args) -> Data[permalink][rdoc][edit]
new(**kwargs) -> Data
self[*args] -> Data
self[**kwargs] -> Data

(このメソッドは Data のサブクラスにのみ定義されています) 値オブジェクトを生成して返します。

[PARAM] args:
値オブジェクトのメンバの値を指定します。
[PARAM] kwargs:
値オブジェクトのメンバの値を指定します。
[RETURN]
値オブジェクトクラスのインスタンス。
[EXCEPTION] ArgumentError:
値オブジェクトのメンバの数より多くの引数を渡した場合に発生します。


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>