Menu
Coddy logo textTech

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
false

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

Salida:

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

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