Ruby basics: i metodi

Ruby è notoriamente un linguaggio di programmazione orientato agli oggetti, direi totalmente orientato agli oggetti.

Questo vuol dire che in Ruby qualsiasi cosa è un oggetto, e ciascun oggetto appartiene ad una classe (tralasciamo per ora i concetti di ereditarietà e di ereditarietà multipla).

Una classe può prevedere dei metodi che si applicano agli oggetti che ad essa appartengono, manipolandone le proprietà.

Ciò nonostante, per poter definire ed utilizzare i metodi non è strettamente necessario ricorrere alla programmazione ad oggetti. Volendo, si possono scrivere programmi che adottano un paradigma procedurale, come può accadere nei casi in cui si vogliano realizzare dei semplici script.

Definire un metodo

Per definire un metodo all’interno di un programma Ruby, si usa la seguente sintassi:

def nome_del_metodo(parametro1, parametro2, ...)
  statement
  statement
  ...
end

Si osservano, nell’ordine:

  • la parola chiave def
  • il nome che vogliamo assegnare al metodo
  • una lista (opzionale) di parametri
  • una serie di “statement”, che costituiscono il corpo del metodo (ovvero le istruzioni)
  • la parola chiave end

A differenza di quanto avviene con Python, in Ruby non ci sono obblighi riguardanti l’indentazione del codice; tuttavia è buona norma utilizzare un layout ordinato e consistente per favorire la leggibilità dei programmi.

Esempio

Gli esempi che seguono sono tutti ugualmente corretti e rappresentano modi diversi di scrivere lo stesso metodo:

# lo stile che preferisco
def sum(a, b)
  s = a + b
  return s
end

puts sum(1, 4) # stampa 5
# le parentesi intorno
# ai parametri sono opzionali
# e l'indentazione non conta
def sum a, b
   s = a + b
return s
  end

puts sum 1, 4 # stampa 5

# se non è specificata
# l'istruzione di return,
# il metodo restituisce il valore
# dell'ultima espressione valutata
def sum a, b
  s = a + b
end

puts (sum(1, 4)) # stampa 5

Come detto, l’indentazione dei vari statement è del tutto arbitraria e opzionale, ma è bene seguire un coding style consistente, soprattutto se il vostro codice dovrà essere letto o modificato da altri.

Un’altra caratteristica notevole di Ruby è che è possibile riportare più statement sulla stessa riga, semplicemente utilizzando il ; come delimitatore.

Pertanto, in Ruby è perfettamente lecito scrivere una cosa del genere:

def sum(a, b); s = a + b; return s; end; puts sum(10, 3) # stampa 13

Ovviamente si tratta di uno stile del tutto illeggibile e quindi sconsigliabile.

Confronto con Python

Uno dei principi guida di Python asserisce che c’è un unico modo corretto di fare le cose, tutti gli altri sono sbagliati. Il fatto che Python faccia affidamento sull’indentazione del codice per interpretarne il significato è assolutamente vincolante. Nella pratica, l’unico modo di definire correttamente in Python il metodo sum illustrato poco fa è il seguente:

def sum(a, b):
  s = a + b
  return s

print(sum(1, 4)) # stampa 5

Nel codice precedente si osserva che:

  • è obbligatorio usare l’istruzione return per restituire il valore calcolato;
  • la fine dell’indentazione determina la fine del metodo, quindi non è previsto nessun delimitatore esplicito;
  • le parentesi mostrate sono tutte obbligatorie.

Come si può dedurre, Ruby conferisce estrema flessibilità al programmatore per quanto riguarda lo stile di programmazione, mentre Python “costringe” a scrivere il codice in maniera ordinata affinché possa funzionare correttamente.

Alcuni preferiscono la rigidità di Python; io sinceramente preferisco di gran lunga la libertà di Ruby.

Ovviamente questa libertà ha un prezzo, ed è quello di imparare a mantenere uno stile di programmazione coerente e leggibile.