2016-07-12 14 views
0

Ich bin ein paar Monate in Ruby zu lernen, und im Moment versuche ich, ein südkoreanisches/nordkoreanisches Wörterbuch zu bauen. Ich füttere es mit einer Textdatei, die alle Wörter enthält.Ruby: Konstante, Modul, Hash

Bisher habe ich bekam:

module Dictionary 

    DICTIONARY = [] 

end 

class File 

    include Dictionary 

    def self.convert(file) 
    readlines(file).each do |line| 
     south, north, meaning = line.split(',') 
     DICTIONARY << { :south => south, :north => north, :meaning => meaning } 
    end 
    end 

end 

File.convert("dictionary.txt") 

Dictionary::DICTIONARY.sort_by { |word| word[:north] }.each do |word| 
    puts "#{word[:south]} is #{word[:north]} in North Korean. They both mean #{word[:meaning]}" 
end 

Meine Frage ist:

1) Ist es nicht notwendig, für mich ein separates Modul für das Array zu machen? (Ich habe hauptsächlich versucht, mit dem Mischen in Modulen und Klassen zu experimentieren)

2) Verwendet eine Konstante für das Array die richtige Bewegung? Ich denke, mein Denkprozess war, dass ich wollte, dass das Array von außen zugänglich ist, aber um ehrlich zu sein, weiß ich nicht wirklich, was ich mache.

Vielen Dank im Voraus.

+0

Was meinst du mit "von außen"? Welche Art von Anwendung erstellen Sie? –

+0

Sie können eine 'instance_variable' mit einem Wörterbuch anstelle von' constant' erstellen. –

+3

Ich würde vorschlagen, die Klasse 'File' nicht zu verschmutzen, weil es eine universelle Klasse zum Lesen/Schreiben aller Arten von Dateien ist, nicht nur für Ihre spezifische Verwendung. Fall. – Aetherus

Antwort

6

Da Ihr Wörterbuch aus einer Datei geladen wird, ist es besser, anstelle eines Moduls eine Klasse zu verwenden, damit jede Datei in einem separaten Wörterbuch analysiert werden kann.

class Dictionary 
    attr_reader :content 

    def initialize 
    @content = [] 
    end 

    def self.load(path) 
    instance = new 
    File.open(path) do |f| 
     f.each_line do |line| 
     instance.content << %i(south, north, meaning).zip(line.split(',')) 
     end 
    end 
    instance 
    end 
end 

Außerdem können Sie sehen, ich nicht die File Klasse Patch haben, weil File nicht nur für die Erstellung von Wörterbüchern ist, sondern für alle Arten von Dateimanipulation.

+1

Sie sollten 'Instanz'-Variable von' self.load' Methode zurückgeben. –

+0

@LukasBaliak Vielen Dank. Der Code ist festgelegt. – Aetherus

+0

@Aetherus Frage: Können Sie den Teil 'instance = new' und 'instance.content' erklären? – iswg