【问题标题】:Abstract type in Julia and member variablesJulia 中的抽象类型和成员变量
【发布时间】:2017-03-30 22:10:32
【问题描述】:

对于 Julia 中的 abstract 类型是否可以具有成员变量(如 C++ 中的虚拟类),我感到非常困惑。我确定文档提到它,但我找不到它!

我尝试了类似的方法:

abstract AbstractR
  source
end

现在我有了一个具体的实现:

type RR <: AbstractR
end

function loadSource(reg::RR, x::AbstractString)
  println("Hello")
end

但是,当我尝试加载模块时,我有:

错误:LoadError:LoadError:LoadError:UndefVarError:来源不是 定义

那么抽象类型只是一个类型名称而没有别的吗?另外,为什么语言设计者决定不支持成员变量(如果确实如此)。另外,我并没有真正看到拥有abstract 类型的意义......

编辑

模块文件

module TestProj
export AbstractR
export RR
include("generic.jl")
include("rr.jl")
end

generic.jl

abstract AbstractR
  source
end

rr.jl

type RR <: AbstractR
end

function loadSource(reg::RR, x::AbstractString)
  println("Hello")
end

【问题讨论】:

  • 你使用的是哪个 Julia 版本?
  • @miguelraz 0.5.1

标签: julia


【解决方案1】:

至少我理解的方式是抽象类型旨在充当“节点”,因此它们本身不是可实例化的(sp?)。因此,它们允许您将具体类型组织成层次结构,并为方法提供一种简单的方法来调度任何一组具体类型。

我认为文档解释了这一点 here

(有了这个错误消息也应该有意义?)

【讨论】:

  • 这是正确的。抽象类型没有成员变量。如果 OP 对类型系统设计背后的推理感兴趣,文档中对此进行了解释。 julia(或任何语言)的新用户最常问的问题是为什么设计师没有按照新用户的语言设计它。答案是它是一种不同的语言。您可能需要以不同的方式考虑代码设计,但这实际上是您从新语言开始的原因。一般来说,尝试学习用 Julian 做事是最有成效的方法。
  • @MichaelK.Borregaard 我明白了。我也知道由于过去的经历而产生的偏见。了解设计背后的思考过程仍然很好。回到问题,我知道抽象类型不能被实例化(这与其他语言类似),但我错过的是它们也不能有成员变量。
  • @Luca cool 并不是要听起来很烦人 :-) 我认为要实现的关键(也许你已经做到了)是因为分派,抽象类型可以有方法 - 而不是变量.所以用 OO 的说法,抽象类型的目的是继承方法。但是,由于方法存在于类型之外,因此类型层次结构中不同节点共享的方法可以非常详细地进行微调。
  • @MichaelK.Borregaard 你并不讨厌 :-) 感谢这些链接。我现在真的开始喜欢朱莉娅了。花整个周末编码,更好地了解其背后的理念。有些我同意,有些我不同意。但总的来说,这是一次积极的经历。我还设法移植了我的一些 python 代码,并且开箱即用地获得了相当不错的加速。我想我会把我所有的科学计算工作都交给 Julia。看看情况如何。
【解决方案2】:

那么您正在加载一个模块吗? 也许你必须先导入东西。 你能把整个代码贴出来吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2018-05-03
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多