【问题标题】:Multiple dispatch for methods of a class in JuliaJulia中类方法的多次调度
【发布时间】:2015-12-20 03:35:02
【问题描述】:

我的问题是如何在 Julia 的某个类重载某些方法?

换句话说,假设我有一个类的以下定义:

type Sometype
    prop::String

    setValue::Function

    # constructor
    function Sometype()
        this = new ()

        this.prop = ""

####### v1 #######
        this.setValue = function(v::Real)
            println("Scalar Version was Invoked!")
            # operations on scalar...
            # ...
        end

####### v2 #######
        this.setValue = function(v::Vector{Real})
            println("Vector Version was Invoked!")
            # operations on vector...
            # ...
        end

####### v3 #######
        this.setValue = function(v::Matrix{Real})
            println("Matrix Version was Invoked!")
            # operations on Matrix...
            # ...
        end

        return this
    end
end

所以当我在我的主要代码中说:

st = Sometype()
st.setValue(val)

取决于valscalarvector 还是ma​​trix,它会调用setvalue 方法的相应版本。现在,根据上面的定义,它用最后一个(在本例中为矩阵版本)覆盖了setvalue 的定义。

【问题讨论】:

  • setValue 是一个Function 类型的变量,可以像其他常见变量一样被覆盖。目前看来,julia doesn't support 多次调度 anonymous functions
  • 它覆盖setValue 的事实是这里的问题。我想以这样的方式对其进行编码,它将编译 setValue 的所有版本,其中一个版本被适当地调用为传递的输入 val
  • 您可以使用generic function,尝试为这些函数赋予相同的名称,例如function foo(v::Real)function foo(v::Vector{Real})function foo(v::Matrix{Real})。但是,这不是朱莉娅风格,请参阅@David 的回答

标签: julia overloading multiple-dispatch


【解决方案1】:

这种面向对象编程 (OOP) 的风格,其中函数存在于对象中,在 Julia 中没有使用。

相反,在 Julia 中,我们只是在对象定义之外定义方法。例如:

type Sometype
    prop::String
end

Sometype(v::Real) = ...

function Sometype{T}(v::Vector{T})  # parametric type
    ....
end

请注意,第一个定义是在单行上定义简单函数的简写方式示例,第二个示例用于更复杂的函数。

正如@GnimucKey 所指出的,您应该使用v::Vector{T}T 参数化的函数,而不是v::Vector{Real}。我已经相应地改变了我的答案。指定为v::Vector{Real} 的参数将永远匹配参数,因为不可能创建抽象类型Real 的对象,并且类型的不变性意味着像Vector{Float64} 这样的对象不是Vector{Real} 的子类型。

【讨论】:

  • 我认为function Sometype{T<:Real}(v::Vector{T}) ... end 更好。因为Vector{Int} <: Vector{Real} 会返回一个false,这很容易出现一些意外错误。
  • <: 在@GnimucKey 提到的参数复合类型上的行为得到了彻底的解释in the docs
  • @GnimucKey 是的,你说得对,好点。我会改变我的答案。
猜你喜欢
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 2021-03-13
  • 2015-01-12
  • 2021-02-06
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多