.length
Nos muestra la longitud del objeto. No es aplicable a los objetos de la clase Fixnum.
EJEMPLOS:
--------------------
abcd.length ---> 4 #Es un objeto string
--------------------
foo = "abc"
foo.length ---> 3 #Es el objeto variable foo
-------------------
fuu = ["abc" , "cde"]
fuu.length ---> 2 #Es el objeto array
fuu.length[0] ---> #Es la longitud del primer elemento del array
------------------
Los objetos de Ruby
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)
Estos objetos estás limitados por sus métodos 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:
Programa
Salida
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 número y tipo texto (cualquier cadena de caracteres)
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.
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.
Consideraciones en los programas de Ruby I
Consideraciones en los programas de Ruby I:
- Cuando veamos una línea que empieza con # significa que no se ejecuta, es una o varias líneas de comentario.
- Cuando vea algo que empieza con mayúscula es una constante.
- El signo = no significa igualdad, sino asignación, es decir lo de la derecha del signo se le asigna a lo de la izquierda del mismo
- Normalmente las líneas del programa se escriben de izquierda a derecha pero en algunos casos no se leen igual que se escriben. Si se leen como se escriben cuando no hay procedimiento que está simbolizado por un punto a la derecha del nombre de un objeto, ejemplos:
- #, print, puts, etc. se leen como se escriben. (Son órdenes internas)
- i.to_i, etc. hay que leerlo de derecha a izquierda. (to_i utiliza una característica del objeto i)
- El uso de dobles comillas o comillas simples se diferencia en que las dobles pueden contener ordenes y las simples sólo contienen caracteres de texto. Ejemplos:
Programa
#Hola Mundo
pp = "mundo"
pp1 = 'monda'
puts "Hola mundo"
puts 'hola mundO'
puts "Hola " + pp
puts 'Hola #{pp}'
puts "Hola #{pp}"
puts "Hola #{pp1}"
puts "Hola " + pp1
>ruby ppp.rb
Resultado:
Hola mundo
hola mundO
Hola mundo
Hola #{pp}
Hola mundo
Hola monda
Hola monda
>Exit code: 0
- Lo números son súmeros mientras no se diga otra cosa:
Programa
#Hola Mundo
pp = "1"
pp1 = '1'
pp2 = 1
pp3 = pp2.to_s
puts 'Soy pp = '+pp+' Soy un string'
puts 'Soy pp1 = '+pp1+' Soy un string'
puts "Soy pp2 = #{pp2} Soy un número"
puts "Ahora soy pp3 = string de pp2 = "+pp3
>ruby ppp.rb
Resultado
Soy pp = 1 Soy un string
Soy pp1 = 1 Soy un string
Soy pp2 = 1 Soy un número
Ahora soy pp3 = string de pp2 = 1
>Exit code: 0
- En los ejemplos anteriores hemos definido variables cuando poníamos = y la forma de leerlo es así: en el ejemplo pp = “1” ---> el string 1 se le asigna a pp
pp3 = pp2.to_s ---> la forma de string de la variable pp2 se le asigna a pp3
- Cuando hay un procedimiento hay que empezar a leer por él.
- Las constantes son aquellos caracteres que empiezan por mayúsculas: P = 1
- Las variables pueden ser de tres tipos:
- locales; empiezan por minúsculas y llevan =
- Son aquellas que utilizamos en un momento determinado en el cuerpo del programa.
- No son válidas dentro de procesos ni clases.
- Las de instancia; son las que empiezan por @ y llevan =
- Las de clase, que empiezan por @@ y llevan = (Las veremos mas adelante)
ejemplos:
Programa
#variables y contantes
A = 1 #Constante
a = 2 #variable local
@a = 4 # variable de instancia
def suma #defino un procedimiento
b = 10 #variable local dentro de procedimiento
puts "@a+b = #{@a+b}"
@c = @a+b #defino una variable local interna al procedimiento
puts "b+@c = #{b+@c}" #puedo sumarla con las variables y constantes generales
end # termino el procedimiento
suma
puts "Puedo sumar lo troncal con la definición"
puts "a+@c = #{a+@c}"
puts "o también hacer A+@a+@c = #{A+@a+@c}"
puts 'pero la variable b sólo puede ser usada dentro de def'
>ruby pppp.rb
Resultado
@a+b = 14
b+@c = 24
Puedo sumar lo troncal con la definición
a+@c = 16
o también hacer A+@a+@c = 19
pero la variable b sólo puede ser usada dentro de def
>Exit code: 0
- Como se puede observar #{} permite introducir una operación dentro de una cadena de caracteres
- puts y print son los encargados de mostrar por pantalla lo que sea
- puts devuelve un retorno de carro tras mostrar su mensaje
- print lo pone todo seguido.
Programa
#print y puts
print 'hola'
puts 'hola'
print "hola\n" #Lleva el procedimiento u orden \n = retorno de carro por esto necesita comillas
puts 'hola'
Resultado
>ruby pppp.rb
holahola
hola
hola
>Exit code: 0
- =begin
=end
es un comentario de varias líneas, todo pegadito a la izquierda.
Por ahora son unas consideraciones a tener en cuenta.
