错误:类型Nullable没有字段名称Julia

时间:2016-05-22 13:06:45

标签: julia

数组中的

我有Object,由两个构造函数

创建
type Node
  name::AbstractString
  value::Int
  left::Nullable{Node}
  right::Nullable{Node}

  Node(name::AbstractString, value::Int) = new(name, value, Nullable{Node}(), Nullable{Node}())
  Node(name::AbstractString, value::Int, left::Node, right::Node) = new(name, value, left, right)
end

当我尝试访问nodes[1].right.name时,我收到了类似主题的错误,但我确定是否有对象

nodes[1] 
Node("New",15,Nullable(Node("bb",7,Nullable{Node}(),Nullable{Node}())),Nullable(Node("cc",8,Nullable{Node}(),Nullable{Node}())))

我该如何解决?

编辑我输入我的整个代码

A = [Node("aa", 11) , Node("bb", 7), Node("cc", 8), Node("d", 11)]

function HuffmanNodes(nodes::Vector{Node})
  while(length(nodes) > 1)
    left = minimal(nodes)
    Left = nodes[left[1]]
    deleteat!(nodes, left)
    right = minimal(nodes)
    Right = nodes[right[1]]
    deleteat!(nodes, right)
    top = Node("New",Left.value+Right.value, Left, Right)
    println(top)
    push!(nodes, top)
    printNodes(top, " ")
  end
end

HuffmanNodes函数中的方法

function printNodes(node::Node, str::AbstractString)
  if(node.name != "New")
    string(node.name, str)
    println(string)
  end
  printNodes(node.left.name , string(str , " 0")
  printNodes(node.right.name , string(str, "  1")
end

function minimal(nodes::Vector{Node})
  minnode = Nullable{Node}()
  minnode = nodes[1]
  minval = nodes[1].value
  for f in nodes
    println(f)
    if f.value < minval
      minval = f.value
      minnode = f
    end
  end
  return find(nodes .==minnode)
end

我尝试拨打HuffmanCode(A),然后我收到错误,我尝试使用get(node.right).name,但这不是问候

2 个答案:

答案 0 :(得分:2)

您能提供最低限度的工作示例吗?根据您发布的代码,我无法创建您尝试访问的Node,而且我并不了解您尝试做的事情。

在任何情况下,nodes[1].right都是Nullable类型,它不是节点(具有name属性)。根据{{​​3}},您应该使用Nullable访问get()对象的值,即get(nodes[1].right)

答案 1 :(得分:2)

您应该使用REPL(即Julia终端)来探索您正在创建的对象。以下是像您一样定义Node类型后的示例会话,就像我在探索Node对象时在终端中编写它一样。

将来,请报告完全您键入的内容以及完全产生的错误,只需通过复制和粘贴,就像我在此处所做的那样,然后制作您的示例尽可能简单,没有额外的细节,无关紧要。

julia> type Node
              name::AbstractString
              value::Int
              left::Nullable{Node}
              right::Nullable{Node}

              Node(name::AbstractString, value::Int) = new(name, value, Nullable{Node}(), Nullable{Node}())
              Node(name::AbstractString, value::Int, left::Node, right::Node) = new(name, value, left, right)
       end

julia> nodes = [Node("a", 1), Node("a", 2)]
2-element Array{Node,1}:
 Node("a",1,Nullable{Node}(),Nullable{Node}())
 Node("a",2,Nullable{Node}(),Nullable{Node}())

julia> nodes[1]
Node("a",1,Nullable{Node}(),Nullable{Node}())

julia> nodes[1].right
Nullable{Node}()

julia> get(nodes[1].right)
ERROR: NullException()
 in get at nullable.jl:30

julia> nodes[1].right = Node("c", 3)
Nullable(Node("c",3,Nullable{Node}(),Nullable{Node}()))

julia> get(nodes[1])
ERROR: MethodError: `get` has no method matching get(::Node)

julia> get(nodes[1].right)
Node("c",3,Nullable{Node}(),Nullable{Node}())

julia> n = get(nodes[1].right)
Node("c",3,Nullable{Node}(),Nullable{Node}())

julia> n.name
"c"