-
-
Save xenda/1904472 to your computer and use it in GitHub Desktop.
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 |
¿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.
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 =/
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.
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 =/