Предположим, у меня есть абстрактная структура, которая должна работать с двумя типами входных данных, например так (подробнее см. предыдущий вопрос SO ).
abstract struct Numberlike
alias Num = (Int32 | Float64)
abstract def -
abstract def -(other : self)
abstract def -(other : Num)
end
Если моя реализация можетиспользуйте self
и Num
взаимозаменяемо, кажется разумным просто сложить их вместе:
struct Term < Numberlike
alias Num = (Int32 | Float64)
getter coeff : Num
getter sym : Symbol
def initialize(@coeff, @sym); end
def -(other : self | Num)
self.class.new(coeff - other, sym)
end
def -
self.class.new(-coeff, sym)
end
end
Правда в том, что поскольку тип является self | Num
, он не соответствует ни self
, ни Num
требование абстрактного класса.
Вы можете увидеть на этой игровой площадке .
Есть ли способ объединить их так, как я хочу?Я бы предпочел не дублировать код без необходимости (т.е. следующие компиляции, но мне это не нравится):
struct Term < Numberlike
alias Num = (Int32 | Float64)
getter coeff : Num
getter sym : Symbol
def initialize(@coeff, @sym); end
def -(other : self)
self.class.new(coeff - other, sym)
end
def -(other : Num)
self.class.new(coeff - other, sym)
end
def -
self.class.new(-coeff, sym)
end
end