Skip to content

Instantly share code, notes, and snippets.

@xenda
Created February 24, 2012 23:16
Show Gist options
  • Save xenda/1904472 to your computer and use it in GitHub Desktop.
Save xenda/1904472 to your computer and use it in GitHub Desktop.
freddie.rb
class Freddie
def initialize
@nivel = 0
end
def tomar
@nivel += 1
end
def borracho?
@nivel > 5
end
def conducir
puts "Ahi le vamos"
end
def dar_llaves
puts "Se las das al amigo"
end
end
cuerpo = Freddie.new
carton = (1..100).to_a
carton.each do |botella|
cuerpo.tomar
if cuerpo.borracho?
cuerpo.dar_llaves
else
cuerpo.conducir
end
end
@neojp
Copy link

neojp commented Feb 25, 2012

Puedes crear metodos con un signo de interrogacion en Ruby? Hmm.. eso no me gusta. Tampoco se puede diferenciar facilmente que estas ejecutando el metodo =/

@xenda
Copy link
Author

xenda commented Feb 25, 2012

¿Qué particularmente no te gusta? Se suele utilizar para casos cuando el método retorna un valor booleano. A mi me encantan porque permite código autodocumentable como:

 user.save if user.valid? 

¿En qué caso no lo diferencias? En Ruby se envian mensajes a los objetos. Por ejemplo, le envío un mensaje "borracho?" y me retorna la respuesta. No hay acceso directo a variables. Siempre son métodos.

@neojp
Copy link

neojp commented Feb 25, 2012

Siempre he usado lenguajes en los que un signo de interrogacion son un caracter especial, me confunde mucho verlo como parte del metodo, obviamente, veo que Ruby es muy distinto y le encuentro sentido a lo que me dices, pero es algo que posiblemente no haria.

No hay acceso a variables o propiedades? No puedes hacer cuerpo.variable? Odio tener que hacer getters y setters para cada propiedad =/

@xenda
Copy link
Author

xenda commented Feb 28, 2012

Es un tema de convención de la comunidad. El enfoque es tener código legible y que se lea bonito. Prefiero

if user.drunk?

if user.drunk

Lo primero se me hace más obvio que retorna un valor booleano, pero entiendo que puede ser más por costumbre (no por algo vengo ya 5 años en Ruby).

Sobre lo segundo, no hay acceso directo a variables. Pero tampoco tienes que hacer getters y setters para acceder a éstas:

class Freddie

  attr_accessor :nivel, :nombre, :posesiones 

end

puts cuerpo.nivel, cuerpo.nombre, cuerpo.posesiones

Y luego

cuerpo.nombre = "John"

Lo genial es que puedes reutilizar esos elementos como quieras. "attr_accessor" crea los métodos por ti, pero si tienes algún
caso especial donde quieres sobreescribirlo, puedes hacerlo:

class Freddie

  def nombre=(valor)
    puts "DESDE ESTE MOMENTO EN ADELANTE, SERA LLAMADO #{valor}"
    @nombre = valor
  end
end

Y eso hace que al usar

cuerpo.nombre = "John Freddie"

Te imprima ese mensaje, etc.

PD: Por si no lo has notado, en Ruby puedo reabrir las clases cuando quiera. Todo el código que he puesto acá debería funcionar así por partes, redefiniendo la clase.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment