Las únicas cuestiones de orden método de tiempo está en el código de mero trámite, y eso es por lo general miope, dado dos métodos:
def greet
puts "%s, Dave" % random_greeting
end
# If I try to use `greet` here, it'll raise a NoMethodError
def random_greeting
["Hello", "Bonjour", "Hallo"].sample
end
# I can use `greet` here, because `random_greeting` is now defiend
Esto funcionaría bien, a menos que quiera utilizar greet
antes random_greeting
se define, la forma en que todo el código no trivial resuelve este es envolver el comportamiento en una clase:
class Doorman
def greet
puts "%s, Dave" % random_greeting
end
def random_greeting
["Hello", "Bonjour", "Hallo"].sample
end
end
Doorman.new.greet
uno puede entonces recibir a los huéspedes de uno con Doorman.new.greet
, envolviendo el comportamiento en una clase se puede modelar la aplicación Bett er (tal vez diferentes objetos en su Código de hotel dar diferentes saludos, por ejemplo) y también mantiene el main
namespace clean.
El objeto main
en Ruby ya tiene 114 métodos definidos, por lo que es mucho mejor poner sus propios métodos en clases que representen actores u objetos en el modelo de su proyecto.
Además de lo que ha dicho en la pregunta sobre de inicialización de una clase, esto es totalmente posible:
class Doorman
def initialize
puts "%s, I'm a new Doorman instance" & random_greeting
end
def greet
"%s, Dave" % random_greeting
end
def random_greeting
["Hello", "Bonjour", "Hallo"].sample
end
end
A pesar de que el método random_greeting
no está definida cuando escribimos initailize
, el conjunto de clases se define antes de llamar al initialize
. De nuevo, al envolver las clases, esto hace la vida más fácil, más limpia y significa que las cosas permanecen en encapsulated.
Nota el ejemplo que no funciona se puede martillar en el código de trabajo mediante la adición de una declaración 'BEGIN': 'BEGIN {def myfunction2; pone "en 2"; end} '. – steenslag
@steenslag Un enfoque aún mejor sería agregar una declaración 'END':' END {myfunction} '. –