ошибки в глухой бабушке - PullRequest
       31

ошибки в глухой бабушке

0 голосов
/ 01 февраля 2012

Выполнял упражнение Pine для Def Grandma и думал, что постараюсь сделать это немного дальше и абстрагировать его, чтобы убрать как можно больше дублирования.

Надеюсь, моя логика с этим не слишком странная, просто попытался разделить вещи на функции.Но теперь, если я наберу

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$ 

Ответы [ 3 ]

2 голосов
/ 01 февраля 2012

Вам нужно переместить строки

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

после определения вашего метода, чтобы метод speaks был определен при достижении строки speaks(speak).

Тогда следующая проблема, с которой вы, вероятно, столкнетесь, будет

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

1 голос
/ 01 февраля 2012

Посмотрите на другие посты, объясняющие использование методов и глобалов. Здесь у вас есть суть , которая работает с Ruby 1.9.3 из-за того, как вы использовали rand

1 голос
/ 01 февраля 2012

Вы вызываете метод speaks до его определения. См. Ruby: как вызвать функцию до ее определения?

...