Ошибка программы Ruby Pattern при выводе на печать - PullRequest
0 голосов
/ 13 сентября 2018

У меня была рабочая логика для динамической печати пирамиды и квадрата, принимая количество строк из терминала. Я столкнулся с ошибкой после включения "module, classes и begin-end block".

module PatternPrinting
  class Operation
    def input
      puts 'Enter the number of rows:'
      rows = Integer(gets.chomp)
      raise StandardError if rows <= 0 || rows > 10
      pyramid(rows)
      square(rows)
    rescue StandardError
      raise StandardError, 'Invalid Input, the entered value exceeds is not between 1-10 '
    end

  def pyramid(rows)
    rows.times do |n|
      print ' ' * (rows - n)
      puts '*' * (2 * n + 1)
    end
  end
  puts "Pyramid Rows: #{pyramid(rows)}"

  def square(rows)
    rows.times do |_n|
      puts '*' * 10
    end
  end
  puts "Sqaure Rows: #{square(rows)}"
end
end

begin
  res = PatternPrinting::Operation.new
  res.input
end

Но я сталкиваюсь с ошибкой

pattern.rb:20:in `<class:Operation>': undefined local variable or method `rows' for PatternPrinting::Operation:Class (NameEr
ror)
        from ./pattern.rb:3:in `<module:PatternPrinting>'
        from ./pattern.rb:2:in `<main>'

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

В ruby ​​отсутствует базовая концепция.

  • Читайте о неявном и явном приемнике ruby. https://www.reddit.com/r/ruby/comments/436d1m/what_is_the_difference_between_an_implicit_and/
  • Локальная переменная имеет видимость метода / функции. Итак, на 20 rows не видно.
  • Даже если предположить, что ваши строки доступны, то также должно выдать ошибку coz, здесь неявный получатель self является вашим классом PatternPrinting. PatternPrinting попытается вызвать метод pyramid, который определен как метод класса https://github.com/rubocop-hq/ruby-style-guide#def-self-class-methods, и ваш получатель PatternPrinting не найдет метод и в итоге вызовет метод, отсутствующий.
  • Я настоятельно рекомендую посмотреть https://rubymonk.com/.
0 голосов
/ 13 сентября 2018

rows - локальная переменная, доступная только в методе input и больше нигде.После завершения этого метода локальные переменные будут потеряны.

Если вы хотите, чтобы данные были доступны для всех методов объекта класса, вам необходимо использовать переменные экземпляра.

Делай

@rows = Integer.get_chomp

А потом делай

@rows.times do |n|

и

@rows.times do |_n|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...