3 votes

Obtenir une propriété de structure à l'intérieur d'une fonction de structure est une erreur

J'ai récemment commencé à essayer d'apprendre Julia à travers des exemples. J'essaye essentiellement de comprendre comment accéder à un fichier struct à l'intérieur d'une fonction dans le struct lui-même. Par exemple

struct Test
    a::Int
    foo::Function

    function Test()
        return new(777, xfoo)
    end

    function xfoo()
        println(a)
    end
end

t = Test()
t.foo() 

J'ai compris :

ERROR: LoadError: UndefVarError: a not defined
Stacktrace:
 [1] (::var"#xfoo#1")()
   @ Main /tmp/j.jl:10
 [2] top-level scope
   @ /tmp/j.jl:15
in expression starting at /tmp/j.jl:15

Est-ce que j'utilise mal Julia ou est-ce que je rate quelque chose ?

3voto

Przemyslaw Szufel Points 20872

Julia n'est pas un langage orienté objet, donc les modèles orientés objet ne sont généralement pas une bonne idée.

Par conséquent, xfoo doit être en dehors de Test :

function xfoo(t::Test)
    println(t.a)
end

Il y a des paquets qui essaient d'émuler la POO avec Julia (cependant ce n'est pas un modèle julien) : https://github.com/Suzhou-Tongyuan/ObjectOriented.jl

Vous pouvez également trouver facilement beaucoup de discussions derrière la décision de conception de ne pas faire de Julia OOP. Commencez avec : https://discourse.julialang.org/t/why-there-is-no-oop-object-oriented-programming-in-julia/86723

Solution de rechange

Par simple curiosité, il est possible de trouver une solution de contournement pour attacher une fonction à un fichier de type struct (un modèle de conception non recommandé !). Par exemple :

mutable struct MyTest
    a::Int
    foo::Function
    function MyTest()
        s = Ref{MyTest}()
        s[] = new(777, () -> println(s[].a))
        s[]
    end
end

Et quelques exemples d'utilisation :

julia> t = MyTest();

julia> t.foo()
777

julia> t.a = 900;

julia> t.foo()
900

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X