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, así que los métodos se apoyan unos en 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 que quien lo llama encadene 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 pasarse a sí mismo a otro código con self, por ejemplo, para devolver al 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 usan cuando quien llama al método 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, para que se puedan encadenar las llamadas. 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 agrega un artículo por línea de entrada (name price) encadenando las llamadas y, luego, imprime summary y free shipping: true o free shipping: false.
Tu código va en shopping_cart.rb. main.rb contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
require_relative 'shopping_cart'
# Código de entrada/salida proporcionado: mantenlo tal 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