Liste collegate, in Ruby

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.printCode language: Ruby (ruby)

(Immagine di copertina di GuerrillaBuzz su Unsplash)

Powered by atecplugins.com