Un mero esercizio per scrostare un po’ il cervello dalle placche dell’abitudine…
Qualche settimana fa, riprendendo in mano il K&R, mi stavo rivedendo le strutture dati e i puntatori nel linguaggio C, e ho fatto il solito esercizio delle liste collegate (linked lists). Devo dire che ci ho messo un bel po’ per fare le cose in maniera corretta, anche perché ricordavo solo vagamente la sintassi delle struct
, l’istruzione typedef
e la funzione malloc()
, ma alla fine ci sono riuscito.
Qualche giorno dopo, nella mia quotidiana lotta di resistenza contro Python, ho provato a vedere se questo genere di strutture dati potevano essere implementate anche in Ruby, e ho trovato un post che le descriveva in maniera abbastanza chiara e comprensibile. Ho letto l’articolo e l’ho poi archiviato in un angolo del cervello, ottimo candidato all’oblio eterno.
Stasera, dopo l’ennesima giornata di cacca dedicata al nulla cosmico, non sapendo come torturare ulteriormente l’encefalo, ho provato a implementare nuovamente le liste collegate in Ruby senza andarmi a rileggere l’articolo. Lo scopo non era quello di vedere quanto la mia memoria fosse ancora efficiente, ma quello di verificare quanto efficacemente avessi assimilato quello che avevo letto.
Anche stavolta mi ci è voluto qualche minuto di troppo, ma alla fine penso di esserci riuscito.
Di seguito lascio il codice della vergogna, visto che sicuramente è scritto male e magari è pure sbagliato. Probabilmente è simile a quello dell’articolo che avevo letto giorni prima, ma giuro che non l’ho copiato.
class Node
attr_accessor :value, :next
def initialize(value)
@value = value
@next = nil
end
end
class List
attr_accessor :head
def initialize
@head = nil
end
def push(value)
if @head.nil?
@head = Node.new(value)
else
current = @head
while !current.next.nil?
current = current.next
end
current.next = Node.new(value)
end
end
def empty?
@head.nil?
end
def pop
if !@head.nil?
value = @head.value
@head = @head.next
return value
end
return nil
end
def print
current = @head
while !current.nil?
puts current.value
current = current.next
end
end
end
values = %w{ pippo pluto paperino }
l = List.new
values.each { |value| l.push value }
puts "Contenuto della lista"
l.print
if !l.empty?
puts "Faccio il pop...: #{l.pop}"
end
puts "Quello che resta..."
l.print
Code language: Ruby (ruby)
(Immagine di copertina di GuerrillaBuzz su Unsplash)