Constantes
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 14 de 57.
Una constante comienza con una letra mayúscula y, por convención, se escribe en mayúsculas. Definida en el cuerpo de una clase, puede usarse por nombre en todos los métodos de la clase. Fuera de la clase, escribes ClassName::NAME:
class Account
MIN_BALANCE = -100
def self.allowed?(balance)
balance >= MIN_BALANCE
end
end
puts Account::MIN_BALANCE
puts Account.allowed?(-50)
puts Account.allowed?(-150)Salida:
-100
true
falseConstantes são adequadas para dados fixos que toda a classe utiliza, como limites ou tabelas de consulta. fetch em uma constante que contém um hash gera KeyError para uma chave desconhecida, em vez de retornar silenciosamente nil:
class Shipping
RATES = { "standard" => 5, "express" => 12 }.freeze
def self.cost(method)
RATES.fetch(method)
end
end
puts Shipping.cost("express")
begin
Shipping.cost("drone")
rescue KeyError => e
puts e.message
endSaída:
12
key not found: "drone"Não é possível apontar um nome de constante para um novo objeto sem que o Ruby exiba um aviso, mas o objeto que ele contém ainda pode ser alterado. freeze torna o próprio objeto somente leitura, portanto uma alteração gera FrozenError:
class Palette
COLORS = ["red", "green"].freeze
end
begin
Palette::COLORS << "blue"
rescue FrozenError => e
puts e.message
end
p Palette::COLORS
p Palette::COLORS.frozen?Saída:
can't modify frozen Array: ["red", "green"]
["red", "green"]
trueEscolha de acordo com o comportamento do valor. Um valor que nunca muda pertence a uma constante congelada; um estado que muda enquanto o programa é executado, como um contador, pertence a uma variável de instância da classe:
class Ticket
PREFIX = "TK" # fixo: uma constante
@issued = 0 # muda: variável de instância de classe
def self.next_code
@issued += 1
"#{PREFIX}-#{@issued}"
end
endDesafio
FácilComplete a classe Order. Ela possui as constantes RATES (um hash congelado: standard custa 5, express 12, pickup 0) e FREE_FROM (50). initialize(total, method) gera ArgumentError com unknown shipping: drone quando o método não é uma chave de RATES. shipping retorna 0 para totais a partir de FREE_FROM e a tarifa caso contrário, e to_s retorna 40.00 + 5 express = 45.00.
O código fornecido imprime free from 50 usando a constante, depois lê pedidos como linhas no formato total method e imprime cada pedido ou a mensagem de erro.
Seu código deve ficar em order.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
require_relative 'order'
# Código de entrada/saída fornecido: mantenha-o como está
input = []
while (line = gets)
input << line.chomp
end
puts "free from #{Order::FREE_FROM}"
input.each do |line|
total, method = line.split
begin
puts Order.new(total.to_f, method)
rescue ArgumentError => e
puts e.message
end
end
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 Livros3Métodos e Variáveis de Classe
Métodos de ClasseVariáveis de Instância da ClasseConstantesMétodos de FábricaRevisão - Códigos de CupomPratique por conta própria: Compilador de Ruby online