Issue #19555 has been updated by FlickGradley (Nick Bradley).
To clarify what I mean, this is a (very rough) demonstration:
``` ruby
class Data
def self.with_defaults(*symbols, **defaults, &block)
defaults&.each { |key, value| raise ArgumentError, "#{key} must be
immutable" unless Ractor.shareable?(value) }
Data.define(*(symbols + defaults.keys)) do
@@defaults = defaults
class_eval(&block) if block
def initialize(**kwargs)
@@defaults.each do |key, value|
kwargs[key] = value unless kwargs.key?(key)
end
super(**kwargs)
end
end
end
end
Point = Data.with_defaults(:x, :y, z: [].freeze) do
def +(other) = self.class.new(self.x + other.x, self.y + other.y)
end
p1 = Point.new(x: 1, y: 2)
p2 = Point.new(x: 3, y: 4)
p3 = p1 + p2
```
This isn't meant to be an actual proposal (lots of holes in this) - but, conceptually,
I'm curious if the Ractor's concept of `shareable?` could or should be applied to
Data, since it _is_ supposed to be immutable.
----------------------------------------
Feature #19555: Allow passing default options to `Data.define`
https://bugs.ruby-lang.org/issues/19555#change-102614
* Author: p8 (Petrik de Heus)
* Status: Open
* Priority: Normal
----------------------------------------
Defining a subclass of `Data` with default attributes can currently be done by overriding
`intialize`:
```ruby
class Point < Data.define(:x, :y, :z)
def initialize(x:, y:, z: 0) = super
end
p Point.new(1, 2)
#=> #<data Point x=1, y=2, z=0>
```
It would be nice if we could do it in `define` as well:
```ruby
Point = Data.define(:x, :y, z: 0)
```
--
https://bugs.ruby-lang.org/