Search code examples
rubyoopencapsulationargument-error

Getting ArgumenError while trying to create instance of a ruby class


I am trying to improve my OO ruby skills. I've created a class and when calling and trying to make ans instance of it, I get error.

Here is the code.

class EncapsulatedPerson
    def initialize(name)
        set_name(name)
    end

    def name
        @first_name + " "+ @last_name
    end

    def set_name
        first_name, last_name = name.split(/\s+/)
        set_first_name(first_name)
        set_last_name(last_name)
    end

    def set_first_name
        @first_name = name
    end

    def set_last_name
        @last_name = name
    end

end

when I load the file, which I wrote above lines into, and attempt to create instances of this class

2.2.0 :004 > ep = EncapsulatedPerson.new('William Wallace')
ArgumentError: wrong number of arguments (1 for 0)
  ... # 

As I understand from error, I should pass 0 arguments when creating new instance (However I believe def initialize(name) ... necessiates one (name) argument'

2.2.0 :003 > ep = EncapsulatedPerson.new
ArgumentError: wrong number of arguments (0 for 1)

I've totally confused. How many arguments does new method require when trying to instantiate it? One argument or no argument?


Solution

  • I'd say, that the error of number of arguments (1 for 0) is caused by your set_first_name and set_last_name methods, which are declared not to accept any arguments:

    class EncapsulatedPerson
      # ...
    
        def set_first_name
            @first_name = name
        end
    
        def set_last_name
            @last_name = name
        end
    
    end
    

    Try updating them, so they accept arguments:

    class EncapsulatedPerson
      # ...
    
        def set_first_name(name)
            @first_name = name
        end
    
        def set_last_name(name)
            @last_name = name
        end
    
    end
    

    Hope this helps!

    EDIT

    The complete code should look like:

    class EncapsulatedPerson
      attr_reader :first_name, :last_name
    
      def initialize(name)
        set_name(name)
      end
    
      def name
        @first_name + " "+ @last_name
      end
    
      def set_name(name)
        first_name, last_name = name.split(/\s+/)
        set_first_name(first_name)
        set_last_name(last_name)
      end
    
      def set_first_name(name)
        @first_name = name
      end
    
      def set_last_name(name)
        @last_name = name
      end
    
    end
    
    epa = EncapsulatedPerson.new('William Wallace')
    puts epa.first_name