RubyTalks[1]

Damir Svrtan

Method visibility in Ruby

Ruby != Java

grep protected * -lR | wc -l

cd Rails

185

Differences between Ruby & Java

Public methods

can be accessed from anywhere.

Ruby & Java:

subclasses inherit public methods.


  class Person

    def age
      rand(1..100)
    end

  end


  Person.new.age

  => 83

Protected methods

Ruby & Java:

subclasses inherit protected methods.

methods can't be accessed outside the class definition.

Ruby:


  class Person

    protected

    def age
      @age
    end

  end


  Person.new.age


  => protected method `age' called for #<Person:0x007fd901098fd0>

Java:

methods can't be accessed outside the class definition or outside of the same package.

Ruby & Java:

methods can be called inside of the class definition on objects of the same class.

Private methods

methods can't be accessed outside the class definition.

Ruby & Java:

Ruby:

subclasses inherit private methods.

Java:

subclasses don't inherit private methods.

Ruby:

can't be called with an explicit receiver


  class Person

    def initialize(age=25)
      @age = age
    end

    def whats_my_age_again?
      self.age
    end

    private

    def age
      @age
    end

  end


  puts Person.new.whats_my_age_again?

  private method `age' called for #<Person:0x007fc06d0d4b18 @age=25>

Fix


  class Person

    def initialize(age=25)
      @age = age
    end

    def whats_my_age_again?
      age
    end

    private

    def age
      @age
    end

  end


  puts Person.new.whats_my_age_again?

  25

Java:

can be called with an explicit receiver

can be called on objects of the same

class in the class definition

Where the hell do I use protected methods?


  class City

     attr_accessor :name, :county, :mayor

     def initialize(name, county, mayor)
        @name = name
        @county = county
        @mayor = mayor
     end

     def ==(other)
       other.class == City && self.full_location == other.full_location
     end

     protected

       def full_location
         "#{name.titleize} #{county.titleize}"
       end
  end

  moj_voljeni_grad = City.new('Zagreb', 'Grad Zagreb', 'Milan Bandic')

  moj_omrazeni_grad = City.new('Zagreb', 'Grad zagreb', 'scumbag')

Two ways to define protected and private methods in Ruby


  class Person

    protected

    def has_sti?
      @has_sti
    end

    private

    def age
      @age
    end

  end

  class Person

    protected def has_sti?
      @has_sti
    end

    private def age
      @age
    end

  end

Since Ruby 2.0:

Exception to the no-explicit-receiver rule for private methods are setters


  class Person

    private
    
    def age=(value)
      @age = value
    end

    def age
      @age
    end
  end


  person = Person.new

  person.age

  => private method `age' called for

  person.age = 25

THNX

RubyTalks[1]

By Damir Svrtan

RubyTalks[1]

  • 1,222