Capítulo 24. Accesores

Tabla de contenidos
El método inspect
Facilitando la creación de accesores
Más diversión con la fruta

En un capítulo anterior se trató brevemente las variables instancia, pero no se hizo mucho con ellas. Las variables instancia de un objeto son sus atributos, eso que diferencia a un objeto de otro dentro de la misma clase. Es importante poder modificar y leer estos atributos; lo que supone definir métodos denominados accesores de atributos. Veremos en un momento que no siempre hay que definir los métodos accesores explícitamente, pero vayamos paso a paso. Los dos tipos de accesores son los de escritura y los de lectura.

  ruby> class Fruta
  ruby|   def set_kind(k) # escritor
  ruby|     @kind = k
  ruby|   end
  ruby|   def get_kind    # lector
  ruby|     @kind
  ruby|   end
  ruby| end
  nilx
  ruby> f1 = Fruta.new
  #<Fruta:0x401c4410>
  ruby> f1.set_kind("melocotón")      #utilizamos el escritor
  "melocotón"
  ruby> f1.get_kind               #utilizamos el lector
  "melocotón"
  ruby> f1                        #inspeccionamos el objeto
  #<Fruta:0x401c4410  @kind="melocotón">
  

Sencillo; podemos almacenar y recuperar información sobre la clase de fruta que queremos tener en cuenta. Pero los nombres de nuestros métodos son un poco largos. Los siguientes son más breves y convencionales:

  ruby> class Fruta
  ruby|   def kind=(k)
  ruby|     @kind = k
  ruby|   end
  ruby|   def kind
  ruby|     @kind
  ruby|   end
  ruby| end
  nil
  ruby> f2 = Fruta.new
  #<Fruta:0x401c30c4>
  ruby> f2.kind = "banana"
  "banana"
  ruby> f2.kind
  "banana"
  

El método inspect

En estos momentos es adecuada una pequeña disgresión. Ya se habrá notado que cuando deseamos ver directamente un objeto se nos muestra algo críptico como lo siguiente #<Fruta:0x401c30c4>. Este es un comportamiento por defecto que se puede modificar. Todo los que se necesita es definir un método denominado inspect. Éste puede devolver una cadena que describa el objeto de una forma razonable, incluyendo el estado de alguna o todas las variables instancia.

    ruby> class Fruta
    ruby|   def inspect
    ruby|     "una fruta de la variedad " + @kind
    ruby|   end
    ruby| end
    nil
    ruby> f2
    una fruta de la variedad banana
    

Un método relacionado es to_s (convertir a cadena) que se utiliza al imprimir un objeto. En general se puede pensar que inspect es una herramienta para cuando se escriben y depuran programas, y to_s una forma de refinar la salida de un programa. eval.rb utiliza inspect cuando muestra resultados. Se puede utilizar el método p para obtener con sencillez resultados para la depuración de programas.

    # las dos líneas siguientes son equivalentes
    p anObject
    print anObject.inspect, "\n"