Julia混凝土类型的子类型

时间:2016-07-08 12:36:18

标签: julia

为了与Julia一起练习,我正在使用迭代器接口实现一个包含一些固定步骤ODE求解器(Euler,Runge Kutta,Bulirsch Stoer)的小模块。

我的想法是使用多个分派将函数next的正确方法应用于特定迭代器,但是Euler和Runge Kutta迭代器类型(实际上immutable)旧的相同数据。 / p>

所以我必须在:

之间做出选择
  1. 除了名称或
  2. 之外,创建两个相同的immutable类型
  3. 创建一个唯一的immutable,其中包含一个附加字段(例如solving_method),并使用分支代替多次发送来解决此问题
  4. 这两个选择对我来说都很笨拙(特别是第二个,因为每次迭代都会检查solving_method字段)。

    阅读有关Julia继承的在线讨论我理解Julia没有(并且永远不会有)具体类型的子类型,这意味着人们不能“将字段”添加到父类型中办法。

    但为什么我不能只为调度目的而拥有具体类型的子类型?

2 个答案:

答案 0 :(得分:2)

解决这种问题的一种惯用方法是创建一个存储参数或解算器状态的类型,然后使用第二个不可变来指定方法:

type SolverOptions
    # ... step size, error tol, etc.
end

immutable RungeKutta end

immutable Euler end

function solve(problem::ODE, method::RungeKutta, options::SolverOptions)
    # ... code here ...
end

function solve(problem::ODE, method::Euler, options::SolverOptions)
    # ... code here ...
end

当然,如果你想在那里存储一些数据,RungeKutta和Euler不一定是空的。这并不总是最好的解决方案(我无法确定它在您的特定情况下是否有效)但是当您尝试防止字段名重复时它会有所帮助。

答案 1 :(得分:1)

也许尝试参数类型?

abstract OdeType
abstract Euler <: OdeType
abstract RK4 <: OdeType

immutable Common{T<:OdeType}
    x::Int
end