mine - in ruby
¿Hay un método "principal" en Ruby como en C? (5)
En realidad, hay una main
, pero no es un método; es el objeto de nivel superior que es el contexto de ejecución inicial de un programa de Ruby.
class Foo
p self
end
#=> Foo
p self
#=> main
def foo
p self
end
foo
#=> main
Soy nuevo para Ruby, así que me disculpo si esto suena realmente tonto.
Parece que no puedo descifrar cómo escribir un código "principal" y tengo métodos en el mismo archivo (similar a C). Termino con un archivo "principal" que carga un archivo separado que tiene todos los métodos. Agradezco cualquier orientación sobre esto.
Vi la siguiente publicación de SO pero no la entiendo: ¿Debo definir un método principal en mis scripts de ruby?
Si bien no es gran cosa, es más fácil poder ver todo el código relevante en el mismo archivo. Gracias.
[-EDITAR-]
Gracias a todos los que respondieron, resulta que solo tiene que definir todos los métodos encima del código. Un ejemplo es a continuación:
def callTest1
puts "in test 1"
end
def callTest2
puts "in test 2"
end
callTest1
callTest2
Creo que esto tiene sentido ya que Ruby necesita saber todos los métodos de antemano. Esto es diferente de C, donde hay un archivo de encabezado que enumera claramente las funciones disponibles y, por lo tanto, puede definirlas debajo de la función main ()
De nuevo, gracias a todos los que respondieron.
La respuesta de @ Hauleth es correcta: no hay un método o estructura main
en Ruby. Solo quiero ofrecer una vista ligeramente diferente aquí junto con alguna explicación.
Cuando ejecuta ruby somefile.rb
, Ruby ejecuta todo el código en somefile.rb
. Entonces, si tienes un proyecto muy pequeño y quieres que sea autónomo en un solo archivo, no hay absolutamente nada de malo en hacer algo como esto:
# somefile.rb
class MyClass
def say_hello
puts "Hello World"
end
end
def another_hello
puts "Hello World (from a method)"
end
c = MyClass.new
c.say_hello
another_hello
No es que los primeros dos bloques no se ejecuten, es solo que no se ven los efectos hasta que realmente se usa la clase / método correspondiente.
El if __FILE__ == $0
es solo una forma de bloquear código que solo desea ejecutar si este archivo se ejecuta directamente desde la línea de comando. __FILE__
es el nombre del archivo actual, $0
es el comando que ejecutó el shell (aunque es lo suficientemente inteligente como para descartar el ruby
), por lo que comparar los dos te dice precisamente eso: ¿es este el archivo ejecutado desde la línea de comando? ? Esto a veces lo hacen los codificadores que desean definir una clase / módulo en un archivo y también proporcionan una utilidad de línea de comandos que lo usa. En mi humilde opinión no es una estructura de proyecto muy buena, pero al igual que cualquier cosa, hay casos de uso donde hacerlo tiene mucho sentido.
Si desea poder ejecutar su código directamente, puede agregar una línea shebang
#!/usr/bin/env ruby
# rest of somefile.rb
y hacerlo ejecutable con chmod +x somefile.rb
(opcionalmente cambiarle el nombre sin la extensión .rb). Esto realmente no cambia tu situación. El if __FILE__ == $0
todavía funciona y aún así probablemente no sea necesario.
Editar
Como @steenslag correctamente señala, el alcance de nivel superior en Ruby es un Object
llamado main
. Sin embargo, tiene un comportamiento ligeramente funky:
irb
>> self
=> main
>> self.class
=> Object
>> main
NameError: undefined local variable or method `main'' for main:Object
from (irb):8
No te preocupes por esto hasta que comiences a profundizar mucho más en el idioma. Si quieres aprender mucho más sobre este tipo de cosas, Metaprogramming Ruby es una gran lectura :)
No hay una función principal mágica en Ruby. Ver http://en.wikipedia.org/wiki/Main_function#Ruby
No, no hay tal estructura. Por supuesto, puede definir la función principal, pero no se invocará hasta que lo haga. Ruby ejecuta línea por línea, así que si quieres imprimir ''Hello World'' simplemente escribes:
puts ''Hello World''
La pregunta que mencionaste es acerca de usar un archivo como módulo y ejecutable, así que si escribes
if __FILE__ == $0
# your code
end
Se llamará solo si ejecuta este archivo. Si solo lo requiere en otro archivo, este código nunca se ejecutará. Pero en mi humilde opinión es mala idea, una mejor opción es usar RubyGems y agregar ejecutables.
Si desea ejecutar scripts de Ruby como archivos compilados en C, haga lo siguiente:
#!/usr/bin/env ruby
puts "Hello"
y luego chmod a+x file_name.rb
. Todo lo que está debajo de la primera línea se ejecutará, como si fuera contenido de main
en C. Por supuesto, las definiciones de clases y funciones no le darán ningún resultado hasta que sean instanciadas / invocadas (aunque el código dentro de las definiciones de clases es realmente evaluado , por lo que podría obtener algunos resultados, pero esto no se espera en circunstancias normales).