Menu
CoddyTech

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).total

Salida:

35
60

Dentro 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).count

Salida:

7

Un 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).name

Salida:

Ada
Ada

Los 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
true
challenge icon

Desafío

Fácil

Completa 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?}"
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Ruby online