Search code examples
rubymethodsprivate

Ruby private method


I am studying ruby and somehow, I define some methods as private and I get the error: "undefined method private for class ...". I Post tmy code below. Any help or suggestion will do! Thank you :)

Code:

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

Error:


Solution

  • While indenting isn't critical in Ruby, keeping track of it is very useful when looking for problems in your code, so make it a habit to do it consistently. Use two-spaces per indent and set your tabstops to 2.

    Here's your code indented consistently:

    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 
    

    Notice that you're missed end for your def initialize method due to the closing end to your rescue block. Also, that your methods are embedded inside initialize and how that stands out?