Méthodes et variables d'instance

Nous pouvons simplifier notre constructeur en utilisant une syntaxe plus succinte pour affecter un argument de méthode à une variable d'instance:

class Person
  def initialize(@name : String)
    @age = 0
  end
end

Pour le moment, nous ne pouvons faire grand chose avec une personne: la créer avec un nom, obtenir son nom ou son âge, qui sera toujours égal à zéro. Alors ajoutons une méthode afin de pouvoir vieillir une personne:

class Person
  def become_older
    @age += 1
  end
end

john = Person.new "John"
peter = Person.new "Peter"

john.age #=> 0

john.become_older
john.age #=> 1

peter.age #=> 0

Les noms de méthode commencent avec une lettre minuscule, et, par convention, contiennent seulement des lettres minuscules, des soulignés et des nombres.

De plus, on peut définir become_older dans la définition originale de Person, ou dans une autre définition: Crystal combine toutes les définitions en une classe unique. Ce qui suit est tout à fait valide:

class Person
  def initialize(@name : String)
    @age = 0
  end
end

class Person
  def become_older
    @age += 1
  end
end

Redéfinir des méthodes, et previous_def

Si vous redéfinissez une méthode, la dernière définition prime.

class Person
  def become_older
    @age += 1
  end
end

class Person
  def become_older
    @age += 2
  end
end

person = Person.new "John"
person.become_older
person.age #=> 2

Vous pouvez invoquer la méthode précédemment redéfinie avec previous_def:

class Person
  def become_older
    @age += 1
  end
end

class Person
  def become_older
    previous_def
    @age += 2
  end
end

person = Person.new "John"
person.become_older
person.age #=> 3

Sans arguments ni parenthèse, previous_def reçoit les mêmes arguments que les arguments de la méthode. Sinon, elle reçoit les arguments que vous lui passez.

Initialisation catch-all

Les variables d'instance peuvent aussi être initialisées hors des méthodes initialize:

class Person
  @age = 0

  def initialize(@name : String)
  end
end

Cela va initialiser @age à zero dans chaque constructeur. C'est utile pour éviter la déduplication, mais aussi pour éviter le type Nil à la ré-ouverture d'une classe pour lui ajouter des variables d'instance.

results matching ""

    No results matching ""