Ruby Class, я подозреваю, что неправильно делаю маркеры экземпляра - PullRequest
1 голос
/ 07 июля 2011

Я хочу, чтобы этот класс инициализировался, чтобы получить сообщение для сохранения и ввести для него имя файла.Составляю ли я ошибку, потому что Ruby хочет, чтобы значения создавались только в методе init?Будьте нежны, я новичок в этом.Traceback вставлен ниже.

class DobbsyKretts
  idea = 'arbitaryvalue'
  def initialize
    #Receive idea
    puts "Enter an idea, a secret or anything else you want to encrypt. Hit enter to stop typing and save the file"
    @idea.gets.reverse.upcase
    #Filename and saving - to encrypt the file.
    puts "Enter the file name you'd like to have this saved as. Type PLAN at the beginning for plans and REM for reminders"
    @file_name.gets.strip
    File::open("DobbsyKrett-"+ file_name + ".txt", "w") do |f|
      f>>@idea
    end
  end
end

something = DobbsyKretts.new

Traceback:

testy.rb:11:in `initialize': private method `gets' called for nil:NilClass (NoMethodError)
    from testy.rb:21:in `new'
    from testy.rb:21:in `<main>'
Enter an idea, a secret or anything else you want to encrypt. Hit enter to stop typing and save the file

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

gets - это либо Kernel#gets, либо IO#gets (для краткости опущу ARGF#gets), @idea в вашем случае не является объектом ввода-вывода (по умолчанию любая переменная экземпляра установлена ​​на nil ), а вызов Kernel#gets с явным получателем запрещен. Итак, правильный код @idea = gets.

2 голосов
/ 07 июля 2011

Вы звоните gets на @idea до присвоения значения - это одна из причин, по которой вы получаете ошибку.Кроме того, get не должен вызываться для переменной экземпляра здесь.Попробуйте это так:

class DobbsyKretts
  def initialize
    #Receive idea
    puts "Enter an idea, a secret or anything else you want to encrypt. Hit enter to stop typing and save the file"
    (@idea = gets).reverse.upcase
    #Filename and saving - to encrypt the file.
    puts "Enter the file name you'd like to have this saved as. Type PLAN at the beginning for plans and REM for reminders"
    @file_name = gets.strip
    File::open("DobbsyKrett-"+ @file_name + ".txt", "w") do |f|
      f << @idea
    end
  end
end

something = DobbsyKretts.new

Это работает так, как вы ожидали, но я просто хотел бы напомнить вам, что это очень плохая идея сделать что-то подобное в конструкторе.Вы должны использовать специальный метод для генерации файлов и / или запроса ввода данных пользователем.

...