【问题标题】:Julia: Append an element to an array of custom typesJulia:将元素附加到自定义类型的数组
【发布时间】:2016-11-17 10:24:26
【问题描述】:

在 Julia 中将元素附加到数组的工作方式如下:

v = Array{Int32, 1}(0)
append!(v, 1)
append!(v, 2)
println(v)  # prints: Int32[1,2]

当我尝试使用自定义类型时

type Node
    label::String
    value::Int32
end
nodes = Array{Node, 1}(0)
append!(nodes, Node("a", 42))

我收到以下错误:

ERROR: LoadError: MethodError: no method matching length(::Node)

我假设我必须“实现”length 方法,但不知道如何。

【问题讨论】:

    标签: arrays julia


    【解决方案1】:

    append! 命令并没有像你想象的那样做。您正在考虑push! 命令。

    append! 命令追加两个数组在一起。两个参数都需要是数组:

    julia> append!(nodes, [Node("a", 42)])
    1-element Array{Node,1}:
     Node("a",42)
    

    没有length 实现必要
    (该错误只是告诉您它试图读取第二个参数的数组长度并找到不是数组的内容。)

    【讨论】:

    • 或者,只需使用push!,这似乎就是您想要做的事情。
    • 有趣的是 append!(v,1) 工作虽然 ... 可能是为了方便,但根据 append! 的文档它不应该 ... 不确定这是否应该被报告为错误与否... :)
    • 嗯,我明白了,append!(v,1) 有效,因为length(1) 返回1。 (length(x::Number) = 1; 在 numbers.jl 第 14 行中定义)
    【解决方案2】:

    试试这个

    Base.append!(x::Array{Node,1}, val::Node) = push!(x, val)
    

    然后你得到

    append!(nodes, Node("a", 42))
    1-element Array{Node,1}:
     Node("a",42)
    

    您必须为这种特定类型显式创建一个函数,因为 append! 或任何 Base 函数有时(或者可能总是我没有检查)不会接受 Any

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多