2012-02-01 29 views
0

正在完成Def Def奶奶的松樹運動,思想會嘗試並進一步抽取它並儘量避免重複。聾啞人的錯誤奶奶 - 鬆 - 沒有方法

希望我對此的邏輯不是太bizzare只是試圖將事情分解成函數。但現在如果我輸入

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 

錯誤

[email protected]:~/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) 
[email protected]:~/Ruby$ 
+0

是否有任何拋出異常?因爲你的方法不知道變量'counter'和'speak',它們在你的方法範圍之外。將它們從方法傳遞到方法,或者使用類或全局變量檢出。http://www.rubyist.net/~slagell/ruby/globalvars.html – ThoKra 2012-02-01 11:44:10

回答

2

你需要,當你到達speaks(speak)線的方法定義後的行

puts 'Say something nice to Grandma.' 
puts 'You may need to shout > ' 
speak = gets.strip 
counter = 0 
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

+0

從@Terw鏈接我找到類http:// www。 rubyist.net/~slagell/ruby/classes.html。這基本上是否意味着如果我創建了一個帶有def plus&def的類計數器,那麼所有的定義都需要加上plus counter + = 1。然後用MyCounter = counter.new開始一個新實例,然後我可以讓我們MyCounter.plus貫穿整個功能? – sayth 2012-02-02 05:25:54

1

看看解釋方法和全局變量使用的其他文章。 Here you have a gist,因爲您使用的方式與Ruby 1.9.3配合使用rand