Menu
Coddy logo textTech

Constantes

Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 14 sur 57.

Une constante commence par une lettre majuscule et, par convention, s’écrit en majuscules. Définie dans le corps d’une classe, elle peut être utilisée par son nom dans chaque méthode de la classe. En dehors de la classe, vous écrivez 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)

Sortie :

-100
true
false

Les constantes conviennent aux données fixes utilisées par toute la classe, telles que des limites ou des tables de correspondance. fetch sur une constante de type hash déclenche KeyError pour une clé inconnue au lieu de renvoyer silencieusement 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

Sortie :

12
key not found: "drone"

Un nom de constante ne peut pas pointer vers un nouvel objet sans que Ruby n’affiche un avertissement, mais l’objet qu’il contient peut toujours être modifié. freeze rend l’objet lui-même accessible en lecture seule, donc toute modification lève 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?

Résultat :

can't modify frozen Array: ["red", "green"]
["red", "green"]
true

Choisissez en fonction du comportement de la valeur. Une valeur qui ne change jamais appartient à une constante figée  l’état qui change pendant l’exécution du programme, comme un compteur, appartient à une variable d’instance de classe :

class Ticket
  PREFIX = "TK"                  # fixe : une constante
  @issued = 0                    # change : variable d'instance de classe

  def self.next_code
    @issued += 1
    "#{PREFIX}-#{@issued}"
  end
end
challenge icon

Défi

Facile

Complétez la classe Order. Elle possède les constantes RATES (un hash gelé : standard coûte 5, express 12, pickup 0) et FREE_FROM (50). initialize(total, method) lève ArgumentError avec unknown shipping: drone lorsque la méthode n'est pas une clé de RATES. shipping renvoie 0 pour les totaux supérieurs ou égaux à FREE_FROM, et le tarif dans le cas contraire ; to_s renvoie 40.00 + 5 express = 45.00.

Le code fourni affiche free from 50 en utilisant la constante, puis lit les commandes sous forme de lignes total method et affiche chaque commande ou le message d'erreur.

Votre code doit se trouver dans order.rb. main.rb contient le code d'entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

require_relative 'order'

# Code d'entrée/sortie fourni : le garder tel quel
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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Ruby en ligne