聋人奶奶的错误 – 松 – 没法
正在为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