Menu
CoddyTech

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
false

Las 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
end

Salida:

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"]
true

Elige 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
end
challenge icon

Desafío

Fácil

Completa 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
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