From: "FlickGradley (Nick Bradley) via ruby-core" Date: 2023-04-03T02:05:08+00:00 Subject: [ruby-core:113079] [Ruby master Feature#19555] Allow passing default options to `Data.define` 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) #=> # ``` 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/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/