【问题标题】:Is it possible to call an overloaded function from overwriting function in Julia?是否可以从 Julia 中的覆盖函数中调用重载函数?
【发布时间】:2016-08-23 13:10:22
【问题描述】:

问题如下:

我有一个抽象类型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 来说已经足够了,但是当使用MyType2 类型的参数调用dosth 时,我希望发生一些特定于MyType2 的额外事情,当然,我想重用现有的代码,所以我尝试了以下,但它没有工作:

function dosth(x::MyType2)
    dosth(x::MyAbstract)
    println(2)
end

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

这意味着 Julia 有一段时间没有意识到我试图将 x 视为它的“超类型”。

是否可以从 Julia 的覆盖函数中调用重载函数?我该如何优雅地解决这个问题?

【问题讨论】:

    标签: julia abstract overloading


    【解决方案1】:

    您可以使用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”更直观的名称有什么想法,请在下方发表评论。

    【讨论】:

    • 非常感谢您的回答!我阅读了您链接的讨论。 @callsuper 这个名字会表达我想做的很好的想法。
    • 谢谢 - 这是有用的反馈。我认为这也是迄今为止最好的名字。
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2021-05-16
    • 1970-01-01
    • 2011-09-22
    相关资源
    最近更新 更多