Allow abstract methods to be implemented via `method_missing`

Aperta
#11 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
48/100
Tipo di issue
Funzionalità
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
ruby
Ambito
tooling

Direzione di ricerca

Inizia riproducendo l’esempio MyInterface dell’issue con interface!, il metodo astratto demo e Parent#method_missing, quindi traccia cosa succede quando Child include MyInterface. Confronta il percorso di esecuzione con e senza l’inclusione. Il lavoro è completato quando un metodo astratto gestito da method_missing può essere chiamato senza l’inaspettato NotImplementedError, mentre i metodi mancanti non correlati continuano a comportarsi come mostrato.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

good first issue

In theory: this should be possible:

# typed: true

require "type_toolkit"

module MyInterface
  interface!
  
  #: -> void
  def demo; end
end

class Parent
  def method_missing(m, ...)
    return super unless m == :demo
    
    puts "#demo implemented via #method_missing"
  end
end

class Child < Parent
  # Commenting out this module inclusion makes call succeed
  include MyInterface
end

Child.new.demo

For comparison, Sorbet's static typechecker doesn't allow this, because it doesn't have any way to prove what is or isn't implemented by method_missing. Sorbet runtime raises an error, which can be a change in runtime behaviour (compared to what you would expect without it):

# typed: true

require "sorbet-runtime"

module MyInterface
  extend T::Sig
  extend T::Helpers
  
  interface!
  
  sig { abstract.void }
  def demo; end
end

class Parent
  def method_missing(m, ...)
    return super unless m == :demo
    
    puts "#demo implemented via #method_missing"
  end
end

class Child < Parent
  # Commenting out this module inclusion makes call succeed
  include MyInterface
end

Child.new.demo # (NotImplementedError)
# The method `demo` on MyInterface is declared as `abstract`. It does not have an implementation.
Lingua principale
Ruby
Stelle
3
Fork
5
Merge medio
8g 23h
PR unite (30g)
8

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di Shopify/type_toolkit

Tutte le issue di Shopify/type_toolkit

Issue simili

Altre issue su Ruby

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.