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. Definida en el cuerpo de una clase, puede usarse por su 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
falseLas constantes son adecuadas para datos fijos que utiliza toda la clase, como límites o tablas de consulta. fetch en una constante hash genera KeyError para una clave desconocida en lugar de devolver 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
endSalida:
12
key not found: "drone"Un nombre de constante no puede apuntar a un objeto nuevo sin que Ruby muestre una advertencia, pero el objeto que contiene aún puede modificarse. freeze hace que el objeto 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 comporta 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 totales desde FREE_FROM en adelante y la tarifa en caso contrario, y 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 como 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/salida y no se puede editar.
Pruébalo tú mismo
require_relative 'order'
# Código de entrada/salida suministrado: déjalo 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