聋人奶奶的错误 – 松 – 没法

正在为Def奶奶完成松树运动,并且思考会尝试进一步采取并抽象它以尽可能多地删除重复。

希望我对此的逻辑并不是太过分,只是试图将事物分离成函数。 但现在如果我输入

Bye 

程序立即退出而不进入exitPlan函数。 欢迎任何建议。

 puts 'Say something nice to Grandma.' puts 'You may need to shout > ' speak = gets.strip counter = 0 speaks(speak) def speaks(speak) if speak != 'Bye' talk() else exitPlan() end end def talk() if speak == speak.downcase puts 'Huh Speak up Sonny' counter -= 1 else year = rand(1930..1951) puts 'No not Since ' + year.to_s counter -= 1 end if counter < 0 counter = 0 # don't want counter going below zero. end puts 'Say something nice to Grandma' speaks() end def exitPlan() counter += 1 unless counter == 3 puts 'Say something nice to Grandma' speaks() else puts 'good night Sonny' end end 

错误

 renshaw@renshaw-TravelMate-5740G:~/Ruby$ ruby -W dGrand.rb Say something nice to Grandma. You may need to shout > Bye dGrand.rb:6:in `': undefined method `speaks' for main:Object (NoMethodError) renshaw@renshaw-TravelMate-5740G:~/Ruby$ 

你需要移动线条

 puts 'Say something nice to Grandma.' puts 'You may need to shout > ' speak = gets.strip counter = 0 speaks(speak) 

在您的方法定义之后,以便在您到达speaks(speak)行时定义speaks方法。

然后你可能会遇到的下一个问题是

 in `exitPlan': undefined method `+' for nil:NilClass 

这是因为counter是一个局部变量,因此不会在您的顶层代码和不同方法之间共享。 你需要使用一个全局变量,即$counter ,或者更好的是,将各种方法放在一个类中,然后使用一个实例变量。


我怀疑你的代码中还有一些其他问题,比如你似乎只是调用gets.strip来获取输入一次。 但是,就将代码包装在类中而言,它不是您要包装的计数器,因为您仍然需要在各种方法之间传递它。 这是整个说话/谈话互动,所以有点像

 class Grandma def initialize @counter = 0 end def speaks(speak) .. end def talk() .. end def exitPlan() .. end end grandma = Grandma.new grandma.speaks(speak) 

并使用对@counter引用替换当前使用本地counter变量的地方

你在定义之前调用方法speaks 。 请参阅Ruby:如何在定义之前调用函数?

看看解释方法和全局变量使用的其他post。 在这里你有一个与Ruby 1.9.3一起使用的要点 ,因为你使用了rand