6 nov. 2018

Teoría - Los objetos de Ruby

Todo en Ruby es un objeto, lo cual nos está hablando de que tiene (digámoslo así) unas características propias y algo se puede hacer con ello (mas o menos como en el mundo real) para hacer algo. Imaginemos un objeto real como un tornillo, está definido por sus características físicas, su funcionalidad y su finalidad, individual o colectiva en conjunción con otros objetos.
En Ruby, estos objetos estás definidos por una clase y limitados por sus métodos (funcionalidades) que son las acciones que se pueden realizar.
La manera de saber qué métodos tiene un objeto es con una orden interna: .methods

Programa:
a=2

puts a.methods
Salida



%

inspect

taguri

<<

singleton_method_added

&

clone

>>

round

rpower

public_methods

taguri=

display

to_r

instance_variable_defined?

divmod

equal?

freeze

integer?

chr

*

+

to_i

methods

respond_to?

-

upto

between?

numerator

prec

truncate

/

dup

instance_variables

__id__

modulo

succ

|

method

eql?

zero?

id

~

to_f

send

singleton_methods

lcm

power!

prec_i

taint

step

to_int

instance_variable_get

frozen?

instance_of?

__send__

^

remainder

to_a

+@

to_yaml_style

nonzero?

-@

type

**

floor

<

require_gem

object_id

instance_eval

protected_methods

gcdlcm

<=>

require

==

prec_f

quo

>

===

downto

id2name

size

instance_variable_set

extend

kind_of?

abs

>=

gem

to_yaml_properties

next

denominator

to_s

<=

to_yaml

coerce

class

hash

ceil

private_methods

=~

tainted?

to_bn

rdiv

div

untaint

nil?

gcd

times

to_sym

is_a?

[]

>Exit code: 0



Programa:

a="hola"

puts a.methods



Salida:

%

select

[]=

inspect

taguri

<<

each_byte

clone

gsub

casecmp

display

public_methods

to_str

partition

tr_s

taguri=

empty?

instance_variable_defined?

tr!

freeze

equal?

rstrip

*

match

grep

chomp!

+

next!

swapcase

ljust

to_i

swapcase!

respond_to?

methods

between?

upto

reject

sum

hex

dup

insert

reverse!

chop

instance_variables

delete

dump

__id__

tr_s!

concat

member?

method

succ

find

eql?

each_with_index

strip!

id

rjust

to_f

send

singleton_methods

index

collect

oct

all?

is_complex_yaml?

slice

taint

length

entries

chomp

instance_variable_get

frozen?

upcase

sub!

squeeze

include?

instance_of?

__send__

upcase!

crypt

delete!

to_yaml_style

detect

to_a

zip

lstrip!

type

center

<

require_gem

object_id

instance_eval

protected_methods

map

<=>

rindex

require

>

any?

==

is_binary_data?

split

===

strip

size

sort

instance_variable_set

gsub!

count

succ!

downcase

min

extend

kind_of?

squeeze!

downcase!

intern

>=

gem

to_yaml_properties

next

find_all

to_s

<=

each_line

to_yaml

each

rstrip!

class

slice!

hash

sub

private_methods

tainted?

replace

inject

=~

tr

reverse

untaint

nil?

sort_by

lstrip

to_sym

capitalize

max

chop!

is_a?

capitalize!

scan

[]

unpack


Todo esto es lo que tienen definidos los objetos tipo que pueden ser Fixnum (cualquier número entero) Como en la vida real, sólo puede trabajar con objetos de la misma naturaleza, pero sus métodos pueden hacer que cambien de naturaleza, es decir, pueden convertir un número en texto y viceversa.
Ruby es capaz de distinguir los números enteros llamados Integer en Fixnum y Bignun que son los números grandes y pequeños positivos y negativos sin coma decimal, los Float son los decimales

Para comprender mejor los métodos veremos algunos:

.capitalize ---> Convierte en mayúscula el primer carácter en una cadena de caracteres.

.to_i ---> Convierte una cadena en número entero

.to_f --->Convierte una cadena en número flotante (decimal)

.to_sym ---> Convierte una cadena en símbolo.

.upcase --->  Convierte una cadena en mayúsculas.

.downcase --->  Convierte una cadena en minúsculas.

.swapcase --->  Convierte una cadena en mayúsculas y minúsculas alternadas.



Baste esto por ahora para hacernos una idea de qué son los métodos.



Los objetos en Ruby se clasifican en clases y para saber en qué clase están se utiliza la siguiente orden: .class

Nos encontraremos con que existen estas clases: Fixnun, Float, String, Array, Hash, Class, Integer, Rational.

a=2

b=2.0

c="a"

d=[]

e={}

f=2.to_r

g= 2.to_a

puts a.class

puts b.class

puts c.class

puts d.class

puts e.class

puts f.class

puts g.class



Da:

>ruby pppp.rb

pppp.rb:7: warning: default `to_a' will be obsolete

Fixnum

Float

String

Array

Hash

Rational

Array


Como vemos Ruby lee lo que ponemos y entiende en qué clase trabajará, puesto que es en ella donde se definen los métodos con los que podrá hacer algo el objeto, así, cuando ponemos a=1 ruby entiende que 1 es el valor (variable) asignado a a (que es el objeto nuevo), ésta es de la clase Fixnum, por ser un número, y le dota de sus métodos, por ser una instancia de Fixnum, así pues a hereda todas los métodos de Fixnum.

Para entendernos, cuando ponemos a='Hola' lo que hace Ruby es:

1.- a es un objeto definido por Hola.

2.- está limitado por las comillas lo cual le convierte en String

3.- le asigna los métodos de los String para que los pueda usar.

Las clases se pueden definir con .new o con los constructores literales:

String ---> ' ó "

Símbolo ---> :

Array ---> [ ]

Hash ---> { }

Rango ---> .. ó …

Expresiones regulares ---> /

Pero, ¿ordenes como puts o print, son objetos?

Bien, para que todo sea un objeto todo debe salir de una clase general que lo contenga que se llama Class, esta clase genera un objeto que los engloba a todos y se llama main, la manera de saber en qué objeto estamos es con la orden self: puts self

Así que puts y print son objetos definidos en main y no hace falta volver a definirlos.

En fin, que todo es un objeto, todo está contenido en clases y todo tiene métodos propios para poder manejar los objetos y relacionarse entre ellos. La cuestión es ir averiguando qué hace lo que uno quiere, no a la sintaxis meramente, sino a la idea de lo que uno quiere hacer.

Un ejemplo a grosso modo, si uno quiere fabricar helados, tendrá que usar de una máquina de helados donde poder darle las características que uno quiera (esto es la clase), también el helado tendrá sabor, olor, tamaño, etc., son las variables del objeto, y los métodos serán los materiales que unidos entre sí formen la máquina de hacer helados, tornillos, tuercas, muelles, paneles, líquidos, etc. infinidad de objetos y características de todo con todo en perfecta armonía para degustar el helado.

Se que aún me quedan muchas mas cosas qué decir, pero las dejo pendientes para otras entradas.