Open
Description
It looks like it isn't possible to override instance methods in a ::Data
subclass that is simply inheriting but not defining any fields.
#!/usr/bin/env ruby
puts ?=*72
puts "Ruby Engine: #{RUBY_ENGINE} #{RUBY_ENGINE_VERSION}"
Simple = Data.define(:foo) do
def deconstruct = [:ok, *super]
def deconstruct_keys(keys) = {xtra: :ok, **super}
end
class Inherits < Data.define(:foo)
def deconstruct = [:ok, *super]
def deconstruct_keys(keys) = {xtra: :ok, **super}
end
class Abstract < Data
def deconstruct = [:ok, *super]
def deconstruct_keys(keys) = {xtra: :ok, **super}
end
Layered = Abstract.define(:foo)
simple = Simple[foo: :bar]
inherit = Inherits[foo: :bar]
layered = Layered[foo: :bar]
puts " simple.deconstruct: %p" % [simple.deconstruct]
puts " simple.deconstruct_keys(nil): %p" % [simple.deconstruct_keys(nil)]
puts " inherit.deconstruct: %p" % [inherit.deconstruct]
puts " inherit.deconstruct_keys(nil): %p" % [inherit.deconstruct_keys(nil)]
puts " layered.deconstruct: %p" % [layered.deconstruct]
puts " layered.deconstruct_keys(nil): %p" % [layered.deconstruct_keys(nil)]
__END__
$ ruby test.rb && RBENV_VERSION=truffleruby-dev ruby test.rb
========================================================================
Ruby Engine: ruby 3.4.4
simple.deconstruct: [:ok, :bar]
simple.deconstruct_keys(nil): {xtra: :ok, foo: :bar}
inherit.deconstruct: [:ok, :bar]
inherit.deconstruct_keys(nil): {xtra: :ok, foo: :bar}
layered.deconstruct: [:ok, :bar]
layered.deconstruct_keys(nil): {xtra: :ok, foo: :bar}
========================================================================
Ruby Engine: truffleruby 25.0.0-dev-e36b2ff4
simple.deconstruct: [:ok, :bar]
simple.deconstruct_keys(nil): {:xtra=>:ok, :foo=>:bar}
inherit.deconstruct: [:ok, :bar]
inherit.deconstruct_keys(nil): {:xtra=>:ok, :foo=>:bar}
layered.deconstruct: [:bar]
layered.deconstruct_keys(nil): {:foo=>:bar}