2016-07-12 5 views
0

Я через несколько месяцев изучаю Ruby, и сейчас я пытаюсь построить южнокорейский/северокорейский/английский словарь. Я кормлю его текстовым файлом, в котором есть все слова.Ruby: constant, module, hash

До сих пор я получил:

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 

Мой вопрос:

1) Является ли это ненужным для меня, чтобы сделать отдельный модуль для массива? (Я просто пытался экспериментировать со смешением в модулях и классах)

2) Использует ли константу для массива правильный ход? Думаю, мой мыслительный процесс состоял в том, что я хотел, чтобы массив мог получить доступ извне, но, честно говоря, я не знаю, что я делаю.

Заранее спасибо.

+0

Что значит «снаружи». Какой тип приложения вы строите? –

+0

Вы можете создать 'instance_variable' со словарем вместо' constant' –

+3

Я бы предложил не загрязнять класс 'File', потому что это универсальный класс для чтения/записи всех видов файлов, а не только для вашего конкретного использования - дело. – Aetherus

ответ

6

Поскольку ваш словарь загружен из файла, лучше иметь класс вместо модуля, чтобы каждый файл мог быть проанализирован в отдельный словарь.

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 

Кроме того, вы можете видеть, что я не залатать File класс, потому что File не только для создания словарей, но и для всех видов обработки файлов.

+1

Вы должны вернуть переменную 'instance' из' self.load'. –

+0

@LukasBaliak спасибо. Код исправлен. – Aetherus

+0

@Aetherus Вопрос: не могли бы вы объяснить часть «instance = new» и «instance.content»? – iswg