Классы Ошибка в Ruby - NoMethod - PullRequest
       2

Классы Ошибка в Ruby - NoMethod

0 голосов
/ 03 февраля 2012

Исходя из вопроса о бабушке, я хотел воспользоваться их советом и дополнить прилавок как класс. Глухая бабушка

Здесь я нахожусь на

puts 'Say something nice to Grandma.'
puts 'You may need to shout > '

class Counter
  counter = 0
  def Plus
    counter += 1
  end
  def Minus
    counter -= 1
  end
  def Reset
    counter = 0
  end
end

MyCounter = Counter.new

def speaks()
    $speak = gets.strip
    if $speak != 'Bye'
        talk()
    else
        exitPlan()
    end
end

def talk()
    if $speak == $speak.downcase
        puts 'Huh Speak up Sonny'
    else
        year = rand(1930..1951)
        puts 'No not Since ' + year.to_s
    end
        MyCounter.Minus
        if counter < 0
            Counter.reset
        end
        puts 'Say something nice to Grandma'
        speaks()
end

def exitPlan()
    MyCounter.Plus
    unless counter == 3
        puts 'Say something nice to Grandma'
        speaks()
    else
        puts 'good night Sonny'
    end
end
speaks()

Это ошибка NoMethod

C:\Users\renshaw family\Documents\Ruby>ruby gran2.rb
Say something nice to Grandma.
You may need to shout >
Hi
No not Since 1939
gran2.rb:10:in `Minus': undefined method `-' for nil:NilClass (NoMethodError)
        from gran2.rb:35:in `talk'
        from gran2.rb:22:in `speaks'
        from gran2.rb:52:in `<main>'

1 Ответ

3 голосов
/ 03 февраля 2012

Когда вы делаете следующее:

class Counter
  counter = 0
end

counter является локальной переменной и исчезает при выходе из определения класса , это означает, что он не существует в любое время позже, и, таким образом, counter равно nil, и вы пытаясь вызвать - (nil) при выполнении counter -= 1, что приводит к NoMethodError. Похоже, вы пытаетесь инициализировать переменную экземпляра во время создания экземпляра:

class Counter
  def initialize
    @counter = 0
  end

  def plus
    @counter += 1
  end

  def minus
    @counter -= 1
  end

  def reset
    @counter = 0
  end
end

Метод initialize - это имя конструктора в Ruby, которое вызывается при вызове Counter.new. Также обратите внимание, что я изменил имена методов, чтобы они начинались со строчной буквы, как это принято: имена классов пишутся с большой буквы, а методы и переменные строчными.

Я бы также весьма не рекомендовал бы использовать глобальные переменные (например, $speak).

...