2016-08-03 45 views
2

Diese Frage betrifft die Verwendung von Typen und Vektoren von Typen. Ich bekomme MethodError: convert, wenn ich zwei Dateien haben, Foo.jl und Baz.jl, die jeweils ein Modul enthalten, und jedes Modul einen Typ enthält.MethodError: `convert` bei Verwendung von Typen, die in Modulen in separaten Dateien definiert sind

  1. Der Inhalt Foo.jl:

    module FooModule 
    type Foo 
        bar::Int 
    end 
    end 
    
  2. Der Inhalt Baz.jl:

    module BazModule 
    include("Foo.jl") 
    type Baz 
        qux::Vector{FooModule.Foo} 
    end 
    end 
    

Typ Foo eine Int enthält, und geben Baz enthält eine Vector von Foo.

die Fehler erhältst ich eine Julia 0.4.7-pre + 3 REPL öffnen, in dem diese Dateien gespeichert sind, und geben Sie

include("Foo.jl") 
include("Baz.jl") 
foo1 = FooModule.Foo(1) 
baz1 = BazModule.Baz([foo1]) 

, wo der vierten Befehl diesen Fehler gibt:

Es

ERROR: MethodError: `convert` has no method matching convert(::Type{BazModule.FooModule.Foo}, ::FooModule.Foo) 
This may have arisen from a call to the constructor BazModule.FooModule.Foo(...), 
since type constructors fall back to convert methods. 
Closest candidates are: 
    BazModule.FooModule.Foo(::Any) 
    call{T}(::Type{T}, ::Any) 
    convert{T}(::Type{T}, ::T) 
    ... 
in copy! at abstractarray.jl:310 
in call at /Users/james/Documents/code/julia/julia/Baz.jl:5 
scheint ein Fehler aufgrund des Unterschieds zwischen der FooModule mit der include Anweisung in BazModule verbundenen und der FooModule in Foo.jl selbst.

Was ist (sind) der Fehler (s) in meinem Code, und wie sollte ich meinen Stil ändern, um den Fehler (s) zu entfernen?

Antwort

2

Ich machte diese Änderung an Ihrem Code und es funktionierte für mich

module BazModule 
    using FooModule 
    type Baz{T<:FooModule.Foo} 
     qux::Vector{T} 
    end 
end 

denke ich, das Problem mit dem, was Sie taten, war, dass Sie das erste Modul, das Foo Modul in der zweiten Zeile neu definiert von das zweite Dokument

include("Foo.jl") 

Wenn man sich die Fehler suchen Sie bekam werden Sie feststellen,

"call to the constructor BazModule.FooModule.Foo" 

, die Sie sollten eine Vorstellung von der Fehler geben

tl; dr sollten Sie schreiben, anstatt wie „X mit“

(„jl, die X enthält.“)