Métodos y self
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 4 de 57.
Un método puede llamar a otro método del mismo objeto sin escribir un receptor. Ruby envía la llamada al objeto actual, por lo que los métodos se construyen unos sobre otros:
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).totalSalida:
35
60Dentro de un método, self es el objeto sobre el que se llamó al método. Un método que devuelve self permite al llamador encadenar varias llamadas sobre el mismo objeto:
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).countSalida:
7Un objeto también puede entregarse a sí mismo a otro código con self, por ejemplo, para devolver el ganador de una comparación con otro objeto de la misma clase:
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).nameSalida:
Ada
AdaLos nombres de los métodos que responden a una pregunta de sí o no terminan en ?, como empty?. Los parámetros pueden tener valores predeterminados, que se utilizan cuando quien llama omite el argumento:
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?Salida:
false
trueDesafío
FácilCompleta la clase ShoppingCart. add(name, price) almacena un artículo y devuelve el carrito mismo, por lo que las llamadas se pueden encadenar. total devuelve la suma de los precios, free_shipping? devuelve true a partir de un total de 20, y summary devuelve 3 items, total 12.50 (o 1 item, total 4.00), con dos decimales.
El código proporcionado añade un artículo por cada línea de entrada (name price) encadenando las llamadas y, después, imprime summary y free shipping: true o free shipping: false.
Tu código va en shopping_cart.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
require_relative 'shopping_cart'
# Código de entrada/salida suministrado: déjalo como está
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?}"
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de Ruby online