正在为Def Grandma完成pine练习,并认为将尝试进一步抽象它,以尽可能多地消除重复。
希望我的逻辑不是太奇怪,只是想把东西分成几个函数。但现在如果我输入
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 `<main>': undefined method `speaks' for main:Object (NoMethodError)
renshaw@renshaw-TravelMate-5740G:~/Ruby$ 发布于 2012-02-01 19:38:30
你需要移动这些线
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的引用
发布于 2012-02-01 19:42:43
在定义方法speaks之前,您正在调用它。请参阅Ruby: How to call function before it is defined?
发布于 2012-02-01 19:52:15
看看其他解释方法和全局变量用法的帖子。由于您使用rand的方式,可以使用Ruby1.9.3的Here you have a gist
https://stackoverflow.com/questions/9095047
复制相似问题