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