Julia中如何定义元素为自定义Point类型的Line向量类型?
Line 结构体实现问题修复方案
你写的代码存在两个核心问题:
- Julia 中类型继承使用
<:运算符而非::,且Vector{Point}属于具体类型,Julia 不支持自定义结构体继承具体类型,仅支持继承抽象类型。 - 你声明的 Line 结构体包含
s、t两个字段,但构造函数调用new()时仅传入了插值点数组,字段数量和类型完全不匹配,无法初始化。
方案1:组合式实现(保留端点字段,支持数组访问)
这种方式既可以单独访问线段的两个原始端点,也可以像操作普通数组一样直接访问插值点:
struct Point x::Float64 y::Float64 end struct Line s::Point t::Point points::Vector{Point} # 内部构造函数:传入两端点自动生成插值点 Line(s::Point, t::Point) = new( s, t, [Point(s.x + i*(t.x - s.x)/1000, s.y + i*(t.y - s.y)/1000) for i in 0:1000] ) end # 实现基础数组接口,支持索引、长度查询、遍历 Base.getindex(line::Line, i::Int) = line.points[i] Base.length(line::Line) = length(line.points) Base.iterate(line::Line, state=1) = state > length(line) ? nothing : (line[state], state + 1)
使用示例:
s = Point(1, 1) t = Point(8, 9) line = Line(s, t) # 访问原始端点 println(line.s) # 输出 Point(1.0, 1.0) println(line.t) # 输出 Point(8.0, 9.0) # 数组式访问插值点 println(line[1]) # 第一个点为s println(line[end]) # 最后一个点为t println(length(line)) # 输出 1001
方案2:轻量实现(直接返回Point向量)
如果你不需要单独存储原始端点,只需要生成包含插值点的Point向量,可以用更简单的函数式实现:
struct Point x::Float64 y::Float64 end Line(s::Point, t::Point) = [Point(s.x + i*(t.x - s.x)/1000, s.y + i*(t.y - s.y)/1000) for i in 0:1000]
使用示例:
s = Point(1, 1) t = Point(8, 9) line = Line(s, t) # 变量line本身就是Vector{Point}类型,支持所有原生数组操作
内容的提问来源于stack exchange,提问作者mistermonke
相关产品推荐
相关产品推荐

