Menu
Coddy logo textTech

Méthodes et self

Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 4 sur 57.

Une méthode peut appeler une autre méthode du même objet sans écrire de récepteur. Ruby envoie l’appel à l’objet courant, ce qui permet aux méthodes de s’appuyer les unes sur les autres :

class Order
  def initialize(price, quantity)
    @price = price
    @quantity = quantity
  end

  def subtotal
    @price * @quantity
  end

  def shipping
    subtotal >= 50 ? 0 : 5
  end

  def total
    subtotal + shipping
  end
end

puts Order.new(10, 3).total
puts Order.new(20, 3).total

Résultat :

35
60

Dans une méthode, self est l’objet sur lequel la méthode a été appelée. Une méthode qui renvoie self permet à l’appelant d’enchaîner plusieurs appels sur le même objet :

class Counter
  def initialize
    @count = 0
  end

  def add(n)
    @count += n
    self
  end

  def count
    @count
  end
end

puts Counter.new.add(2).add(5).count

Sortie :

7

Un objet peut également se transmettre à un autre code avec self, par exemple pour renvoyer le gagnant d’une comparaison avec un autre objet de la même classe :

class Player
  def initialize(name, score)
    @name = name
    @score = score
  end

  def name
    @name
  end

  def score
    @score
  end

  def winner_against(other)
    score >= other.score ? self : other
  end
end

ada = Player.new("Ada", 9)
bo = Player.new("Bo", 7)
puts ada.winner_against(bo).name
puts bo.winner_against(ada).name

Sortie :

Ada
Ada

Les noms de méthodes qui répondent par oui ou non se terminent par ?, comme empty?. Les paramètres peuvent avoir des valeurs par défaut, utilisées lorsque l’appelant omet l’argument :

class Kettle
  def initialize
    @temp = 20
  end

  def hot?
    @temp >= 90
  end

  def heat(degrees = 10)
    @temp = [@temp + degrees, 100].min
  end
end

k = Kettle.new
k.heat
puts k.hot?
k.heat(75)
puts k.hot?

Sortie :

false
true
challenge icon

Défi

Facile

Complétez la classe ShoppingCart. add(name, price) stocke un article et renvoie le panier lui-même, afin que les appels puissent être chaînés. total renvoie la somme des prix, free_shipping? renvoie true à partir d’un total de 20, et summary renvoie 3 items, total 12.50 (ou 1 item, total 4.00), avec deux décimales.

Le code fourni ajoute un article par ligne d’entrée (name price) en chaînant les appels, puis affiche summary et free shipping: true ou free shipping: false.

Votre code doit être placé dans shopping_cart.rb. main.rb contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

require_relative 'shopping_cart'

# Code d'entrée/sortie fourni : le garder tel quel
input = []
while (line = gets)
  input << line.chomp
end
cart = input.reduce(ShoppingCart.new) do |c, line|
  name, price = line.split
  c.add(name, price.to_f)
end
puts cart.summary
puts "free shipping: #{cart.free_shipping?}"
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Ruby en ligne