Skip to content

Can't override ::Data methods in abstract class #3892

Open
@nevans

Description

@nevans

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}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions