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).totalRésultat :
35
60Dans 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).countSortie :
7Un 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).nameSortie :
Ada
AdaLes 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
trueDéfi
FacileComplé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?}"
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
1Classes et objets
Travailler avec des fichiersDéfinir des classesVariables d’instanceMéthodes et selfto_s et inspectRécapitulatif - Carte de bibliothèque4Encapsulation
Méthodes privéesMéthodes protégéesSetters privésProtéger l’étatRécapitulatif - Distributeur automatique7Polymorphisme et typage canard
PolymorphismeTypage canardMéthodes abstraitesCas et classesRécapitulatif - méthodes de paiement10Patrons de conception – Partie 2
Délégation avec ForwardablePatron DécorateurPatron BuilderPatron État2Accesseurs et self
Lecteurs et écrivainsSetters personnalisésself dans les méthodesIdentité et égalitéRécapitulatif - Liste de contacts5Héritage
Sous-classesRedéfinition des méthodesAppeler superis_a? et ancêtresRécapitulatif - Paie du personnel8Méthodes spéciales
Égalité et hachageMéthodes d’opérateursIndexation et ajoutCollections personnaliséesRécapitulatif - Fractions11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Compilateur Ruby en ligne