Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace
RM MV/MZ

Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Tutos: Godot : Premier Contact -Partie (...) / Tutos: Godot : Premier Contact -Partie (...) / Making-of: Ma première game jam classée / Jeux: Oracle of Tao / Jeux: Mystic Slayer [Value+!] / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

88 connectés actuellement

11003079 visiteurs
depuis l'ouverture

967 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Hellsoft

Planète Glutko

RPG Maker - La Communauté

BloGecko

Guelnika & E-magination

Tous nos partenaires

Devenir
partenaire



forums

Index du forum > Entraide > [RESOLU] [Ruby] Pas de nouvelle instance ?!


Crystal - posté le 15/08/2012 à 07:54:01 (1951 messages postés)

❤ 0

Domaine concerné: Ruby
Logiciel utilisé: Ruby
Bon alors... C'est un problème très embêtant, et j'ai pour l'instant remédié à ce dernier en bricolant quelque chose qui ne me plaît pas du tout dans mon code. Le truc est que mon code refuse de créer une nouvelle instance pour définir une variable.

J'ai ma classe A qui a un attr_accessor machin. Cette variable machin est un Array qui en contient d'autres, avec des nombres dedans. Exemple: J'ai aussi ma classe B qui a un attr_accessor machin2, qui au départ est un Array vide. À un certain moment, alors que machin est toujours à sa valeur originale (vérifié par print), l'interprète Ruby lit un bout de code dans lequel machin2 devient la valeur de machin. Ensuite, pour chaque valeur de machin2, je modifie quelques valeurs, du genre -2 devient 0, -1 devient un nombre aléatoire.

ET pourtant, machin subit chacune des modifications faites à machin2, et CE, même si machin2 devient machin.dup, machin.clone, même si machin est en attr_reader... Si je "freeze" machin, alors vouloir modifier machin2 me dit que c'est frozen. Pourquoi est-ce que le programme bloque sur une chose si ridicule ? Il me semble qu'il devrait être capable d'en faire une instance à part, je desespère car j'ai l'impression d'avoir tout essayé. Au moins j'ai arrangé le problème temporairement, mais je ne comprends pas sa raison d'être du tout surtout si "dup" ne fonctionne même pas.

Pour donner une meilleure idée de la structure... (les valeurs ne sont pas exactement celles de mon script mais c'est juste à titre d'exemple)

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class A
  attr_accessor :machin
  def initialize
    @machin = []
    @machin[0] = [[-1, 1], [0, 1], [-1, 1], [0, 1]]
    @machin[1] = [[3, 1], [1, 1], [2, 1], [0, 1]]
  end
end
 
class B
  attr_accessor :machin2
  def initialize
    @machin2 = []
  end
end
 
# En assumant que $c1 == A.new et $c2 == B.new
# et dans la classe Lala que @index == 0
 
class Lala
  def pouf
    p $c1.machin[@index] # => [[-1, 1], [0, 1], [-1, 1], [0, 1]]
    $c2.machin2 = $c1.machin[@index].dup
    p $c2.machin2 # => [[-1, 1], [0, 1], [-1, 1], [0, 1]]
    for i in $c2.machin2
      i[0] = 2 if i[0] == -1
    end
    p $c1.machin[@index] # => SURPRISE ! [[2, 1], [0, 1], [2, 1], [0, 1]]
  end
end



J'avoue que la logique, j'la vois plus rendu à ce point-là...


Nagato Yuki - posté le 15/08/2012 à 11:45:25 (351 messages postés)

❤ 0

Ceci est tout à fait normal la méthode dup comme la méthode clone, ne copie que l'objet ce qui veut dire qu'il fait une nouvelle structure de celui-ci mais ne va pas recréer tous les objets qui y son contenu un array peut une considéré comme un tableau pointeur d'objet, quand tu clone ça va copier les pointeurs dans un autre array mais en aucun cas ces pointeurs seront modifiés.
image

Tu dois recréer tous les arrays contenu dans ton array pour corriger ça.

Pokémon Workshop, le site de Making Pokémon sur RPG Maker~


Crystal - posté le 15/08/2012 à 11:56:40 (1951 messages postés)

❤ 0

Donc... Si je fais:

Portion de code : Tout sélectionner

1
2
3
4
$c2.machin2 = []
for i in $c1.machin[@index]
  $c2.machin2.push(i)
end



Ça règlerait le problème ? En tout cas, je vais aller l'essayer... Merci pour ta réponse.


TLN - posté le 15/08/2012 à 11:58:25 (16174 messages postés) - honor

❤ 0

Architecte d'Outre-Mondes

Si tu veux faire un copie complète d'un objet un peu compliqué, je te suggère de lire ce post :
https://stackoverflow.com/questions/8206523/how-to-create-a-deep-copy-of-an-object-in-ruby

Apôtre du Grand Kirby tkt.


Nagato Yuki - posté le 15/08/2012 à 12:04:18 (351 messages postés)

❤ 0

C'est pour les variables d'instances à ce que je vois donc ça ne fonctionne pas pour les tableaux. (pour le code)
Sinon j'avais aussi pensé à ce qui a été dit dans le sujet : Marshal.load(Marshal.dump(@object)), après c'est pas énormément propre mais ruby gère bien la mémoire donc il n'y a pas trop de problèmes à utiliser ça...

Pokémon Workshop, le site de Making Pokémon sur RPG Maker~


Crystal - posté le 15/08/2012 à 12:06:27 (1951 messages postés)

❤ 0

OMG merci ! :D Bien que deep_clone n'ait pas fonctionné, la simple technique de Marshal.load(Marshal.dump(obj)) marche à merveille. La situation dans laquelle j'en avais besoin est juste avant un changement d'un menu à un autre, la mémoire utilisée est donc vraiment insignifiante, ça n'affectera pas le jeu. ^^


Nagato Yuki - posté le 15/08/2012 à 12:10:01 (351 messages postés)

❤ 0

Tout dépends de ce contient ton objet.

Pokémon Workshop, le site de Making Pokémon sur RPG Maker~


Crystal - posté le 15/08/2012 à 12:14:59 (1951 messages postés)

❤ 0

Je sais que certains objects comme les Sprite ne sont pas supportés par Marshal, mais dans le cas des Array ça parvient à arranger le problème. :)


TLN - posté le 15/08/2012 à 12:19:22 (16174 messages postés) - honor

❤ 0

Architecte d'Outre-Mondes

Faut garder un tête que cette méthode bien pratique est quand même un peu sale et assez lente si tu fais bcp de copies. Le mieux serait de te créer ta propre méthode deep_clone spécifique à ce que tu veux copier et qui n'oublie rien dans les attributs à copier.

Apôtre du Grand Kirby tkt.


Zeus81 - posté le 15/08/2012 à 17:03:12 (11071 messages postés)

❤ 0

OMG TLN, je prends un screen.
Oui avec une simple méthode récursive tu peux cloner un tableau en une ligne.

Portion de code : Tout sélectionner

1
2
3
4
5
class Array
  def deep_clone
    map {|o| o.is_a?(Array) ? o.deep_clone : o}
  end
end


C'est plus rapide que dump (sauf si ton tableau contient plusieurs références vers le même sous tableau) et puis ça marche même avec les objets non marshalisables.
Par contre ça fait une boucle infinie s'il se contient lui même.
Mais si ton tableau a une profondeur constante de 2 comme dans ton exemple le plus rapide c'est de faire :
clone = array.map {|a| a.clone}

Index du forum > Entraide > [RESOLU] [Ruby] Pas de nouvelle instance ?!

repondre up

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers