Menu
Coddy logo textTech

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

Salida:

7

Un 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).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 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
true
challenge icon

Desafío

Fácil

Completa 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?}"
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