Кристалл, как требовать, чтобы реализующий класс работал на себя, а не на всех братьев - PullRequest
0 голосов
/ 09 мая 2019

Допустим, я хочу, чтобы мой метод принимал все, что является «числом как», т.е. знает, как свести к минимуму, сложить, вычесть, умножить и разделить. Он должен делать это с собой и с номерами (Int32 и Float64 для моих целей)

  abstract struct Numberlike
    alias Num = (Int32 | Float64)
    abstract def -
    abstract def +(other : self)
    abstract def +(other : Num)
    abstract def -(other : self)
    abstract def -(other : Num)
    abstract def *(other : self)
    abstract def *(other : Num)
    abstract def /(other : self)
    abstract def /(other : Num)
  end

У меня проблема с тем, что моя дочерняя структура, кажется, должна работать со всеми Numberlike, а не только с собой. Например

struct Term
  alias Num = (Int32 | Float64)
  getter coeff : Num
  getter sym : Symbol

  def initialize(@coeff, @sym); end

  def -(other : self)
    self.class.new(coeff - other.coeff, sym)
  end
end

Выше может вернуться abstract `def Numberlike#-(other : self)` must be implemented by Term потому что компилятор интерпретирует мое требование как «быть уверенным, что все числа схожи могут работать со всеми другими числами схожими», но я хочу найти способ сказать: «быть уверенным, что все термины могут работать и с числами и терминами (self)».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...