2012-02-03 70 views
0

继续从奶奶问题开始,我想在这里接受他们的建议,并将计数器作为一个类来使用。 Deaf GrandmaRuby中的类错误 - NoMethod

这是我在

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>' 

回答

3

当你做到以下几点:

class Counter 
    counter = 0 
end 

counter是一个局部变量和消失当你退出类定义,这意味着它在以后的任何时间都不存在,因此counternil,并且您在尝试在counter -= 1上尝试呼叫-nil),结果为NoMethodError。你似乎想要做的就是实例化过程中初始化instance variable

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被调用。还请注意,我已经将方法名称更改为以小写字母开头,正如惯例所述:classnames是大写字母,方法和变量都是小写字母。

我也高度劝阻使用全局变量(例如$speak)。