首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >耳聋奶奶的错误--没有方法

耳聋奶奶的错误--没有方法
EN

Stack Overflow用户
提问于 2012-02-01 19:30:52
回答 3查看 240关注 0票数 0

正在为Def Grandma完成pine练习,并认为将尝试进一步抽象它,以尽可能多地消除重复。

希望我的逻辑不是太奇怪,只是想把东西分成几个函数。但现在如果我输入

代码语言:javascript
复制
Bye

程序会立即退出,而不会继续执行exitPlan函数。欢迎任何建议。

代码语言:javascript
复制
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

错误

代码语言:javascript
复制
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$ 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-01 19:38:30

你需要移动这些线

代码语言:javascript
复制
puts 'Say something nice to Grandma.'
puts 'You may need to shout > '
speak = gets.strip
counter = 0
speaks(speak)

在方法定义之后设置为,以便在到达speaks(speak)行时已经定义了speaks方法。

那么您可能会遇到的下一个问题是

代码语言:javascript
复制
in `exitPlan': undefined method `+' for nil:NilClass

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

我怀疑您的代码中还存在其他一些问题,例如您似乎只调用gets.strip来获取一次输入。然而,就将代码包装在类中而言,它不是你想要包装的计数器,因为你仍然需要在不同的方法之间传递它。它是整个说/说交互,所以大致是这样的

代码语言:javascript
复制
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的引用

票数 2
EN

Stack Overflow用户

发布于 2012-02-01 19:42:43

在定义方法speaks之前,您正在调用它。请参阅Ruby: How to call function before it is defined?

票数 1
EN

Stack Overflow用户

发布于 2012-02-01 19:52:15

看看其他解释方法和全局变量用法的帖子。由于您使用rand的方式,可以使用Ruby1.9.3的Here you have a gist

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9095047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档