format internet:

…please wait (42% completed)…

[Q&A] Diferencia entre nil y empty

Posted by javier ramirez on July 5, 2008

Inauguro una nueva serie en el blog. Como sabéis, me gusta participar en las listas de correo para aprender de los gurús, y para echar una mano cuando puedo a la gente que tiene dudas.

De vez en cuando respondo a mensajes en las listas de correo que me parecen dudas genéricas. Otras veces contesto a problemas con los que me he encontrado antes y que no eran fáciles de encontrar en la documentación. Creo que puede ser interesante referenciar estos mensajes en el blog para darles un poco más de visibilidad.

Podrás encontrar todos esos posts marcados con el tag y la categoría format_internet_q&a

En este primer caso de la serie, alguien planteaba cuál es la diferencia entre nil y empty. En concreto, quería entender porqué pasaba esto

x = ""
=> ""
x.nil?
=> false
x.empty?
=> true

Puedes encontrar debajo mi contestación a esta pregunta

> soy nuevo en ruby y me esta gustando mucho el lenguaje me gustaria que me dijeran que diferencia hay entre nil y empty

bueno.. aquí sería interesante si eres nuevo en ruby o si eres nuevo en cualquier lenguaje orientado a objetos. Te lo digo porque el equivalente a nil en muchos otros lenguajes (javascript, java, c++, c#…) es null.

voy a intentar hacer esto rápido.

ruby es un lenguaje muy orientado a objetos, hasta el punto de que todo es un objeto (a diferencia de otros lenguajes, que tienen tipos básicos a los que normalmente se llaman primitivas y luego objetos).

la forma normal de crear un objeto, es utilizar el método new de la clase correspondiente, por ejemplo

Array.new

Cuando llamas a new, se asigna espacio en memoria para alojar un objeto de esa clase, se le asigna internamente un id, y se guarda la referencia a ese objeto en una tabla que ruby lleva internamente. En la línea anterior, verás que hemos creado un Array, pero ni guardamos en ningún sitio una referencia a ese array, no podremos hacer nada con él. Aquí es donde entran en juego las variables. Si haces

a=Array.new

Estás creando un objeto, que se guarda internamente en la memoria, y además estás creando una variable llamada a, que apunta a la referencia de ese objeto en la memoria. De esta forma, cada vez que tu haces algo como

a.size

realmente lo que estás haciendo es invocar al método size del objeto al que apunta a. Ahora si haces

a=Array.new
b=a

Tienes dos variables, pero las dos apuntan al mismo objeto, de forma que si modificas tanto a como b, estás modificando el mismo objeto.

Con esto lo que quiero que veas es que por un lado van los objetos, que es donde realmente se guardan tus valores y se ejecutan tus métodos, y por otro lado las variables, que simplemente valen para apuntar a esos objetos. Si creas un objeto y ninguna variable está apuntándole, ruby lo eliminará de memoria tan pronto como pueda, ya que es inaccesible y nadie lo va a usar.

Teniendo medio claro lo que es un objeto y lo que es una variable, es posible tener una variable que no apunte a ningún sitio. Esto a veces se llama una variable no inicializada (aunque en realidad no es el único caso en el que pasa). Cuando una variable no apunta a ningún sitio, apunta a nil.

a=nil

Eso en muchos lenguajes es una variable que no apunta a ninguna parte. En Ruby es una variable que apunta al objeto nil (porque nil es también un objeto), pero la explicación te vale igual. nil se utiliza para indicar una variable que no apunta a ningún sitio, bien porque no se ha inicializado, bien porque se le ha asignado nil expresamente.

Si tú haces lo que decías en tu mail

x=""

x es una variable que está apuntando a un objeto que es la cadena “”. Al apuntar a ese objeto, puedes utilizar todos los métodos que da la clase String. Por ejemplo,puedes hacer

x.upcase

eso te va a devolver “”, porque la cadena “” en mayúsculas es “”, pero como ves, tienes un objeto String, que puedes usar como quieras. Por lo tanto, si haces

x.nil?

te va a decir “false”, ya que x no apunta a nil, sino a un objeto String vacío. Al estar vacío, si le pides

x.empty?

te va a decir que,efectivamente, la cadena está vacía. Sin embargo, no es nil, porque apunta a un objeto de tipo String que está referenciado en memoria.

Espero que te haya quedado medio claro.. si venías de un lenguaje orientado a objetos, seguro que ya sabes cómo va esto. Si no venías de un lenguaje orientado a objetos, quizás te valga la pena leerte algo de teoría de orientación a objetos para entender cómo funciona ruby. Te será especialmente útil para entender cosas como las variables de instancia, de clase, herencia, constructores, etc. Puedes programar sin conocer todo eso, pero vas a desaprovechar muchas de las funcionalidades disponibles.

puedes encontrar el hilo de este post en

https://listas.escomposlinux.org/pipermail/rubies/2008-July/000721.html

searchwords: nil, empty, ruby programming language, garbage collector, object oriented programming

One Response to “[Q&A] Diferencia entre nil y empty”

  1. Pablo said

    Magnifica explicacion Javi, mas clara imposible!! A proposito que lectura recomendarias sobre Programacion Orientada a Objetos para alguien q viene de la programacion convencional? Algo en la web? algun libro o algo q sepas?

    Gracias y salutes!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: