Constantes
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 14 de 57.
Una constante comienza con una letra mayúscula y, por convención, se escribe en mayúsculas. Si se define en el cuerpo de una clase, se puede usar por nombre en todos los métodos de la clase. Fuera de la clase, se escribe 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
falseLas constantes son adecuadas para datos fijos que usa toda la clase, como límites o tablas de búsqueda. fetch en una constante de tipo hash genera KeyError para una clave desconocida en lugar de devolver nil silenciosamente:
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
endSalida:
12
key not found: "drone"No se puede hacer que un nombre de constante apunte a un objeto nuevo sin que Ruby imprima una advertencia, pero el objeto que contiene aún se puede cambiar. freeze hace que el objeto en sí sea de solo lectura, por lo que un cambio genera 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?Salida:
can't modify frozen Array: ["red", "green"]
["red", "green"]
trueElige según cómo se comporte el valor. Un valor que nunca cambia pertenece a una constante congelada; el estado que cambia mientras se ejecuta el programa, como un contador, pertenece a una variable de instancia de clase:
class Ticket
PREFIX = "TK" # fijo: una constante
@issued = 0 # cambia: variable de instancia de clase
def self.next_code
@issued += 1
"#{PREFIX}-#{@issued}"
end
endDesafío
FácilCompleta la clase Order. Tiene las constantes RATES (un hash congelado: standard cuesta 5, express 12, pickup 0) y FREE_FROM (50). initialize(total, method) genera ArgumentError con unknown shipping: drone cuando el método no es una clave de RATES. shipping devuelve 0 para los totales desde FREE_FROM en adelante y, en caso contrario, la tarifa; to_s devuelve 40.00 + 5 express = 45.00.
El código proporcionado imprime free from 50 usando la constante, después lee los pedidos en líneas con el formato total method e imprime cada pedido o el mensaje de error.
Tu código va en order.rb. main.rb contiene el código proporcionado de entrada y salida y no se puede editar.
Pruébalo tú mismo
require_relative 'order'
# Código de entrada/salida proporcionado: mantenlo tal 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 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 libros3Métodos y variables de clase
Métodos de claseVariables de instancia de claseConstantesMétodos de fábricaRepaso: códigos de cupónPractica por tu cuenta: Compilador de Ruby online