Els objectes en Ruby es poden classificar en tres:

  • Públics -> Públic
  • Privats -> Private
  • Protegits -> Protected

El alcanç d’una variable o d’un mètode, conegut en anglés com scope fa referència a des d’on es pot manar cridar una variable.

Els mètodes públics són mètodes de classe. Es poden cridar des de qualsevol lloc. Des de dins o fora de la classe.

Els mètodes privats poden cridar-se únicament des de dins de la classe. A diferència d’altres llenguatges una classe filla sí que hereta els mètodes privats de la classe. Es poden cridar des de dins de la classe o des de dins d’una classe filla, però no des de fora.

Els mètodes progegits pot cridar-se des d’altres classes sempre que siguen del mateix tipus.

class Humano
  def initialize
    self.publico
  end

  def publico
    puts "Soy público"
  end
end

class Tutor < Humano
end

Humano.new
Tutor.new.publico

Output

Soy público
Soy público
Soy público

D’aquesta manera un mètodo privat donarà una herrada si el cridem des de fora de la classe:

class Humano
  def initialize
    self.publico
  end

  def publico
    puts "Soy público"  
  end

  private
    def privado
      puts "Soy privado"
    end

end

class Tutor < Humano
  def initialize
    self.public
  end
end

Humano.new.privado

Output

Soy público
scope.rb:23:in `<main>': private method `privado' called for #<Humano:0x00000001dac090> (NoMethodError)

Fem la classe constructora privada:

class Humano
  def initialize
    privado
  end

  def publico
    puts "Soy público"
  end

  private
    def privado
      puts "Soy privado"
    end

end

class Tutor < Humano
  def initialize
    self.public
  end
end

Humano.new

Output

Soy privado

3. Mètode protegit

class Humano
  def initialize
    privado
  end

  def publico
    puts "Soy público"
  end

  private
    def privado
      puts "Soy privado"
    end

  protected
    def protegido
      puts "Soy protegido"
 end

class Tutor < Humano
  def initialize
    @iner =Humano.new
  end

  def llamar_protegido
    @inner.protegido
  end
end

class Alien
  def initialize
    @inner = Humano.new
  end

  def llamar_protegido
    @inner.protegido
  end
end

tutor = Tutor.new

alien = Alien.new

puts tutor.is_a?(Humano)
puts alien.is_a?(Humano)