2013-10-30 151 views
0

我正在學習ruby,並以某種方式將一些方法定義爲private,並且我得到錯誤:「未定義的方法專用於類...」。我在下面發佈tmy代碼。任何幫助或建議都行!謝謝:)Ruby私有方法

代碼:

class Bot 
attr_reader :name 

def initialize(options) 
    @name = options[:name] || "Unnamed Bot" 
    begin 
     @data = YAML.load(File.read(options[:data_file])) 
    rescue 
     raise "Could not load bot data" 
    end 

    private 

     def random_response(key) 
      random_index = rand(@data[:responses][key].length) 
      @data[:responses][key][random_index].gsub(/\[name\]/, @name) 
     end 

     def greeting 
      random_response :greeting 
     end 

     def farewell 
      radnom_response :farewell 
     end 

     def response_to(input) 
      prepared_input = preprocess(input).downcase 
     end 

     def preprocess(input) 
      perform_substitutions input 
     end 
end 
end 

錯誤:

+1

您的所有方法都在您的構造函數中定義在此代碼段中。 – yamafontes

回答

0

儘管縮進在Ruby中並不重要,但在查找代碼中的問題時,記住它是非常有用的,因此請務必始終如一地執行此操作。使用每個縮進兩個空格和設置您的製表位爲2

這裏是你的代碼一致縮進:

class Bot 
    attr_reader :name 

    def initialize(options) 
    @name = options[:name] || "Unnamed Bot" 
    begin 
     @data = YAML.load(File.read(options[:data_file])) 
    rescue 
     raise "Could not load bot data" 
    end 

    private 

    def random_response(key) 
     random_index = rand(@data[:responses][key].length) 
     @data[:responses][key][random_index].gsub(/\[name\]/, @name) 
    end 

    def greeting 
     random_response :greeting 
    end 

    def farewell 
     radnom_response :farewell 
    end 

    def response_to(input) 
     prepared_input = preprocess(input).downcase 
    end 

    def preprocess(input) 
     perform_substitutions input 
    end 
    end 

注意,你錯過了enddef initialize方法由於收endrescue塊。此外,你的方法是嵌入在initialize裏面以及如何突出?

+0

優秀的答案,謝謝! :) – manosagent

4

你的私有方法在類的構造函數(該initialize方法)的一部分;他們應該在其他方法之外定義。