gpt4 book ai didi

julia - 是否可以从 Julia 中的覆盖函数中调用重载函数?

转载 作者:行者123 更新时间:2023-12-04 11:20:57 25 4
gpt4 key购买 nike

问题如下:

我有一个抽象类型 MyAbstract和派生的复合类型MyType1MyType2 :

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但是当 dosth使用类型为 MyType2 的参数调用,我希望发生一些特定于 MyType2 的其他事情而且,当然,我想重用现有的代码,所以我尝试了以下方法,但没有奏效:
function dosth(x::MyType2)
dosth(x::MyAbstract)
println(2)
end

x = MyType2("")
dosth(x) # StackOverflowError

这意味着 Julia 没有意识到我试图治疗 x喜欢它的“父类(super class)型”有一段时间了。

是否可以从 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

如果您对比“调用”更直观的名称有什么想法,请在下面发表评论。

关于julia - 是否可以从 Julia 中的覆盖函数中调用重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39102198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com