假设我有一个需要对两种输入像这样操作一个抽象的结构(更多的情况下,看到前面的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
它匹配既不是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