Étant donné un objet Julia de type composite, comment déterminer ses champs?

Je connais une solution si vous travaillez dans le REPL: d'abord vous déterminez le type de l'objet via un appel à typeof, puis entrez en mode aide (?), puis recherchez le type . Existe-t-il un moyen plus programmatique de réaliser la même chose?

18
Yly 17 janv. 2017 à 03:51

2 réponses

Meilleure réponse

Pour la version 0.7 +

Utilisez fieldnames(x), où x est un DataType. Par exemple, utilisez fieldnames(Date), au lieu de fieldnames(today()), ou bien utilisez fieldnames(typeof(today())).

Cela renvoie Vector{Symbol} listant les noms de champs dans l'ordre.

Si le nom d'un champ est myfield, pour récupérer les valeurs de ce champ, utilisez soit getfield(x, :myfield), soit la syntaxe de raccourci x.myfield.

Une autre fonction utile et connexe avec laquelle jouer est dump(x).

Avant la v0.7

Utilisez fieldnames(x), où x est soit une instance du type composite qui vous intéresse, soit un DataType. Autrement dit, fieldnames(today()) et fieldnames(Date) sont également valides et ont la même sortie.

26
Colin T Bowers 22 juil. 2018 à 22:44

Supposons que l'objet soit obj,

Vous pouvez obtenir toutes les informations de ses champs avec l'extrait de code suivant:

T = typeof(obj)
for (name, typ) in zip(fieldnames(T), T.types)
    println("type of the fieldname $name is $typ")
end

Ici, fieldnames(T) renvoie le vecteur des noms de champs et T.types renvoie le vecteur de type correspondant des champs.

4
novatena 18 janv. 2017 à 01:37