Forum Solarus-Games francophone

Jeux amateurs => Tutoriaux => Tutoriaux "Développement" => Discussion démarrée par: Couet le 04 Février 2006 à 23:28

Titre: [RGSS] Propriétés d'objets (par Darth Killer)
Posté par: Couet le 04 Février 2006 à 23:28
Niveau : Amateur (2/5)
Pré-requis : quelques bases de Ruby, par exemple à travers le RGSS.




Bonjour tout le monde !

Pour les pros de RGSS, je vais rien apprendre (je pense), mais pour ceux qui y débutent, je viens de découvrir comment faire les propriétés d'objets donc on se partage ça :lol:


Avant de se lancer, il faut poser les bases.

Vous avez sûrement déjà vu l'usage de propriétés d'objets, comme la propriété ox d'un objet Sprite (obj.ox = obj.x / 2). Le problème c'est que les propriétés ne sont pas gérées par le Ruby pur. La syntaxe obj.id corespond en fait à la méthode id de l'objet obj (donc ox est une méthode de obj). et ses spécifications font qu'elle agit comme une variable propre à l'objet mais utilisable à l'extérieur des méthodes de l'objet. C'est ça une propriété.

Il me fallait donc trouver comment ils ont fait ça en bidouillant. Les variables propres aux objets sont les variables d'instance (@var) mais inutilisables à l'extérieur. Il existe aussi certaines définitions de méthodes assez particulières, vues dans une des aides opérationnelles (la US) :
Citation
# method with no argument. end omitted below
def foo
end

# method with arguments
def foo(arg, arg2)

# method with default argument
def foo(arg = nil)

# with everything
def foo(arg, arg2, arg3 = nil, *rest)

# operator format
def ==(other)
def +(other)
def *(other)

# unary plus/minus
def +@
def -@

# element substitution
def foo=(value)             # obj.foo = value

# [] and []=
def [](key)                 # obj[key]
def []=(key, value)         # obj[key] = value
def []=(key, key2, value)   # obj[key, key2] = value

Vous notez que l'avant-dernier corespond plus ou moins à ce qui nous intéresse ? :mrgreen:

Donc mettons qu'on a une classe d'objet comme ceci

class Test
  def init(name)
    @name = name
  end
end

Je fais simple. L'objet aura pour seule propriété, donc pour seule variable d'instance, une chaîne protant son nom.

$obj = Test.new
$obj.init("Tchô !")

Voilà notre objet et on a initialisé son nom

p $obj.name

Quand on teste ça on a un joli message d'erreur, disant que la méthode name n'existe pas pour cette classe Test ^^

donc on va la créer. Elle doit juste rendre la variable d'instance corespondante


class Test
  def init(name)
    @name = name
  end
  def name
    return @name
  end
end

Maintenant, quand on fait le code juste avant ça marche. Mais une propriété est aussi modifiable de l'extérieur.


p $obj.name
$obj.name = "La frite ?"
p $obj.name


Avec ceci, si l'affichage de "Tchô !" se fait corectement, la ligne suivante génère une erreur. Il faut donc rajouter une nouvelle méthode, du même nom, mais avec une spécification de plus dans sa définition : la substitution !



class Test
  def init(name)
    @name = name
  end
  def name
    return @name
  end
  def name= (v)
    @name = v
  end
end

Attention : pas d'espace là où je n'en ai pas mis !

Avec ça, tout fonctionne au poil. Nous avons bien une propriété name liée à notre objet ^^