Clases en Ruby

Inicializacion

Sin Parámetros:

array1 = Array.new
puts "#{array1}"
# RESULTADO:
#   []

 

Con Parámetros:

array2 = Array.new(["1","2"])
puts "#{array2}"
# RESULTADO:
#   ["1","2"]

 

Clase Propia:

**Nombre en CamelCase

class Car
  def initialize()
    puts "Se ejecuto el inicializador"
  end
end


Car.new

 

Atributos

Sin usar de Attributes Readers/Writers/Accessor:

class Car

  def initialize(colour)
    @colour = colour
  end

  def colour
    @colour
  end

  def colour=(new_color)
    @colour = new_color
  end
  
end

Usando Attribute Reader/Writer/Accessor:

class Car
  # attr_reader :colour    #LECTURA
  # attr_writer :colour    #ESCRITURA
  attr_accessor :colour    #LECTURA Y ESCRITURA

  def initialize(colour)
    @colour = colour
  end

end

 

Atributos Virtuales

Creamos una variable de instancia virtual.

Para el mundo exterior,  parece que nombre_calculado es un atributo más de la clase. No se puede acceder directamente al atributo nombre

Internamente, no tiene ninguna variable de instancia que se llame nombre_calculado, solamente nombre.

class Persona

  def nombre_calculado
    @nombre
  end


  def nombre_calculado=(new_nombre)
    @nombre = "Señor " + new_nombre
  end


  def to_s
    "#{@nombre}"
  end

end

 

personaEjemplo = Persona.new()
personaEjemplo.nombre_calculado = "Pepe"

puts "El nombre de la persona es -->", personaEjemplo.nombre_calculado

#RESULTADO:
#"El nombre de la persona es -->Señor Pepe

MÉTODOS

class Car
  attr_accessor :colour

  def initialize(colour)
    @colour = colour
  end

  def turnOn(sound)
    puts "#{sound}"
  end

  def description
    puts "Soy un coche de color #{@colour}"
  end

end


carExample = Car.new("Red")
carExample.description
carExample.turnOn("Brum Brum")

Método initialize

Al hacer nombreDeLaClase.new para crear un objeto de esta clase, llama al metodo initialize pasandole los parámetros si los tuviera.

Método to_s

to_s significa to string. Hay que definir como quiere que se comporte al pasar el objeto de la clase a string, ya que si no, devuelve la posición de memoria en la que se encuentra.

class Car
  attr_accessor :colour

  def initialize(colour)
    @colour = colour
  end

  def to_s
    {color:@colour}
  end

end


carExample = Car.new("Red")

puts "#{carExample}"         #<Car:0x000055a5a5398410>
puts "#{carExample.to_s}"    #{:color=>"Red"}

Identificador del Objeto

puts "#{carExample.object_id}"

Comprobar si existe un Método:

puts "#{carExample.respond_to?("turnOn")}"    #TRUE

HERENCIA

class Vehicle

  def initialize(number_wheels,colour)
    @number_wheels = number_wheels
    @colour = colour
  end


  def to_s
    "Vehicle: // Number Wheels:#{@number_wheels} // Colour:#{@colour}"
  end

end


class Car < Vehicle

  def initialize(number_wheels,colour,number_doors)
    super(number_wheels, colour)
    @number_doors = number_doors
  end


  def to_s
    super + " // Number Doors:#{@number_doors}"
  end

end

vehicleExample = Vehicle.new(4,"grey")
carExample = Car.new(4,"grey",5)
puts vehicleExample.to_s # Vehicle: // Number Wheels:4 // Colour:grey puts carExample.to_s # Car: // Number Wheels:4 // Colour:grey // Number Doors:5

 

Si en la clase Car no tuviera la funcion to_s, miraria en la clase padre (Vehicle) si existiera….

Ver Listado de Métodos de una Clase

  • Heredados y Propios

puts "#{carExample.methods}"
  • Solo Propios

puts "#{carExample.public_methods(false)}"

 

Control de Acceso, Nivel de Protección de Métodos

Métodos Públicos (public)

Pueden ser llamados por cualquiera.
Los métodos son públicos por defecto menos initialize que es privado

Métodos Protegidos (protected)

Solo pueden ser llamados por los objetos de la clase y subclases. «Solo conocidos de la familia»

Métodos Privados (private)

Solo les puede llamar por el objecto actual

Especificación del nivel de Acceso

class Example

  def metodo_publico_por_defecto

  end

  protected
  def metodo_protegido

  end

  private
  def metodo_privado

  end

  public
  def metodo_publico

  end

end

 

class Example

  def metodo_protegido

  end

  def metodo_privado

  end

  def metodo_publico

  end

  public :metodo_publico
  protected :metodo_protegido
  private :metodo_privado

end