Menu
Coddy logo textTech

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
false

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

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

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

Desafio

Fácil

Complete 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
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de Ruby online