Menu
Coddy logo textTech

Costanti

Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 14 di 57.

Una costante inizia con una lettera maiuscola e, per convenzione, si scrive in maiuscolo. Definita nel corpo di una classe, può essere usata per nome in ogni metodo della classe. Fuori dalla classe si scrive 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)

Output:

-100
true
false

Le costanti sono adatte ai dati fissi utilizzati dall'intera classe, come limiti o tabelle di ricerca. fetch su una costante hash genera KeyError per una chiave sconosciuta, invece di restituire silenziosamente 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

Output:

12
key not found: "drone"

Non è possibile assegnare il nome di una costante a un nuovo oggetto senza che Ruby visualizzi un avviso, ma l'oggetto a cui fa riferimento può comunque essere modificato. freeze rende l'oggetto stesso di sola lettura, quindi una modifica 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?

Output:

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

Scegli in base a come si comporta il valore. Un valore che non cambia mai appartiene a una costante congelata; uno stato che cambia mentre il programma è in esecuzione, come un contatore, appartiene a una variabile di istanza della classe:

class Ticket
  PREFIX = "TK"                  # fisso: una costante
  @issued = 0                    # variabile: variabile di istanza della classe

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

Sfida

Facile

Completa la classe Order. Contiene le costanti RATES (un hash congelato: standard costa 5, express 12, pickup 0) e FREE_FROM (50). initialize(total, method) solleva ArgumentError con unknown shipping: drone quando il metodo non è una chiave di RATES. shipping restituisce 0 per i totali pari o superiori a FREE_FROM e la tariffa negli altri casi, mentre to_s restituisce 40.00 + 5 express = 45.00.

Il codice fornito stampa free from 50 usando la costante, poi legge gli ordini come righe total method e stampa ciascun ordine oppure il messaggio di errore.

Il tuo codice va in order.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

require_relative 'order'

# Codice di input/output fornito: lascialo così com'è
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Ruby online