IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

par valeur ou référence [perl6]


Sujet :

Langage Perl

  1. #1
    Membre habitué

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 134
    Points
    134
    Par défaut par valeur ou référence
    Bonjour,

    Dans ce script, il y a un passage par référence, alors que je m'attends plutôt à un passage par valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    my @fils;
    my $ext-gauche=10;
     
    say @fils[0];
    say @fils[1];
    say "";
     
    @fils[0]=($ext-gauche    ,0);
    @fils[1]=($ext-gauche + 0,0);
     
    say @fils[0];
    say @fils[1];
    say "";
     
    $ext-gauche=15;
     
    say @fils[0];
    say @fils[1];
    Résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    (Any)
    (Any)
     
    (10 0)
    (10 0)
     
    (15 0)
    (10 0)
    Je suis étonné que @fils[0] passe à 15. Le fil 1 reste bien à 10 car je force le passage par valeur en faisant l'adition je suppose.

    Une idée ?

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    En écrivant my $ext-gauche = 10;, tu n'affectes pas la valeur 10 à la variable $ext-gauche. Avec raku c'est plus subtil: tu associes à la variable $ext-gauche un conteneur (container) qui pointe vers un objet (ici un Int de valeur 10).
    Ensuite lorsque tu crées la liste $ext-gauche, 0, l'item 0 de ta liste n'est pas la valeur 10, mais le container lui-même. Donc en écrivant $ext-gauche = 15;, tu ne modifies pas le container mais juste l'objet vers lequel il pointe.
    À noter que comme les listes sont immutables, c'est le seul moyen pour modifier un item; si tu écris par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (1, 2)[1] = 3;
    CATCH { default { say .^name, ': ', .Str } };
    tu obtiendras: X::Assignment::RO: Cannot modify an immutable List ((1 2)).
    Alors qu'en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (1, my $b = 2)[1] = 3;
    CATCH { default { say .^name, ': ', .Str } };
    say $b;
    Il n'y a pas d'erreur, et say $b affiche bien 3 (l'item 1 de la liste est le container auquel $b est associé).


    Pour "forcer l'évaluation" on peut effectivement faire une opération comme $ext-gauche + 0 ou plus simplement +$ext-gauche. Mais on peut aussi choisir un tableau plutôt qu'une liste. Il n'est pas immutable, mais les items sont évalués à sa création:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my @tab = $ext-gauche, 0;
     
    # ou
     
    @fils[0] = [$ext-gauche, 0];
    Dans les deux cas l'item 0 des tableaux sera la valeur de $ext-gauche et ne sera pas lié à son container.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre habitué

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 134
    Points
    134
    Par défaut
    Merci.

    Et en fait, j'ai plus besoin d'une array que d'une liste donc c'est très bien, mais ça reste surprenant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fonction:passage par valeur ou référence
    Par senvedgi dans le forum Débuter
    Réponses: 10
    Dernier message: 01/01/2012, 17h58
  2. Métaprogrammation, T par valeur ou référence ?
    Par mister3957 dans le forum C++
    Réponses: 5
    Dernier message: 19/03/2009, 12h22
  3. Réponses: 36
    Dernier message: 06/03/2009, 11h00
  4. passage paramètre par valeur et référence
    Par new_wave dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 09/03/2008, 18h53
  5. Passage par référence et non pas par valeur
    Par GPZ{^_^} dans le forum Flash
    Réponses: 2
    Dernier message: 14/05/2007, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo