Menu
CoddyTech

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 désigne 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

Résultat :

7

Un objet peut aussi 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

Résultat :

Ada
Ada

Les noms de méthodes qui répondent à une question par oui ou par 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?

Résultat :

false
true
challenge icon

Défi

Facile

Complète 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.

Ton code va 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 : conservez-le 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