Métodos e self
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 4 de 57.
Um método pode chamar outro método do mesmo objeto sem escrever um receptor. O Ruby envia a chamada para o objeto atual, então os métodos se baseiam uns nos outros:
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).totalSaída:
35
60Dentro de um método, self é o objeto no qual o método foi chamado. Um método que retorna self permite que quem o chama encadeie várias chamadas no mesmo 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).countSaída:
7Um objeto também pode passar a si mesmo para outro código com self, por exemplo, para retornar o vencedor de uma comparação com outro objeto da mesma 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).nameSaída:
Ada
AdaNomes de métodos que respondem a uma pergunta de sim ou não terminam em ?, como empty?. Os parâmetros podem ter valores padrão, usados quando quem chama omite o 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?Saída:
false
trueDesafio
FácilComplete a classe ShoppingCart. add(name, price) armazena um item e retorna o próprio carrinho, para que as chamadas possam ser encadeadas. total retorna a soma dos preços, free_shipping? retorna true a partir de um total de 20, e summary retorna 3 items, total 12.50 (ou 1 item, total 4.00), com duas casas decimais.
O código fornecido adiciona um item por linha de entrada (name price) encadeando as chamadas e, em seguida, imprime summary e free shipping: true ou free shipping: false.
Seu código deve ficar em shopping_cart.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
require_relative 'shopping_cart'
# Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação orientada a objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online