是否可以通过覆盖 Julia 中的函数来调用重载函数?
Is it possible to call an overloaded function from overwriting function in Julia?
问题如下:
我有一个抽象类型 MyAbstract
和派生复合类型 MyType1
和 MyType2
:
abstract MyAbstract
type MyType1 <: MyAbstract
somestuff
end
type MyType2 <: MyAbstract
someotherstuff
end
我想为 MyAbstract
类型的对象指定一些一般行为,所以我有一个函数
function dosth(x::MyAbstract)
println(1) # instead of something useful
end
这种一般行为足以满足 MyType1
但是当使用 MyType2
类型的参数调用 dosth
时,我希望发生一些特定于 MyType2
的额外事情] 当然,我想重用现有代码,所以我尝试了以下方法,但没有用:
function dosth(x::MyType2)
dosth(x::MyAbstract)
println(2)
end
x = MyType2("")
dosth(x) # WhosebugError
这意味着 Julia 有一段时间没有意识到我试图像对待它的 "supertype" 一样对待 x
。
是否可以从 Julia 中的覆盖函数调用重载函数?我该如何优雅地解决这个问题?
您可以使用 invoke
function
function dosth(x::MyType2)
invoke(dosth, (MyAbstract,), x)
println(2)
end
使用相同的设置,这会给出以下输出而不是堆栈溢出:
julia> dosth(x)
1
2
可以在 here 中找到有关更换或改进 invoke
界面的讨论。我的建议将使语法非常接近您在问题中所写的内容:
function dosth(x::MyType2)
@invoke dosth(x::MyAbstract)
println(2)
end
如果您对比 "invoke" 更直观的名称有任何想法,请post 在下方发表评论。
问题如下:
我有一个抽象类型 MyAbstract
和派生复合类型 MyType1
和 MyType2
:
abstract MyAbstract
type MyType1 <: MyAbstract
somestuff
end
type MyType2 <: MyAbstract
someotherstuff
end
我想为 MyAbstract
类型的对象指定一些一般行为,所以我有一个函数
function dosth(x::MyAbstract)
println(1) # instead of something useful
end
这种一般行为足以满足 MyType1
但是当使用 MyType2
类型的参数调用 dosth
时,我希望发生一些特定于 MyType2
的额外事情] 当然,我想重用现有代码,所以我尝试了以下方法,但没有用:
function dosth(x::MyType2)
dosth(x::MyAbstract)
println(2)
end
x = MyType2("")
dosth(x) # WhosebugError
这意味着 Julia 有一段时间没有意识到我试图像对待它的 "supertype" 一样对待 x
。
是否可以从 Julia 中的覆盖函数调用重载函数?我该如何优雅地解决这个问题?
您可以使用 invoke
function
function dosth(x::MyType2)
invoke(dosth, (MyAbstract,), x)
println(2)
end
使用相同的设置,这会给出以下输出而不是堆栈溢出:
julia> dosth(x)
1
2
可以在 here 中找到有关更换或改进 invoke
界面的讨论。我的建议将使语法非常接近您在问题中所写的内容:
function dosth(x::MyType2)
@invoke dosth(x::MyAbstract)
println(2)
end
如果您对比 "invoke" 更直观的名称有任何想法,请post 在下方发表评论。