2012-03-13 11 views
32

Soy nuevo en Ruby, así que me disculpo si esto suena realmente tonto.¿Hay un método "principal" en Ruby como en C?

Parece que no puedo entender 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 a la siguiente SO puesto, pero yo no lo entienden: Should I define a main method in my ruby scripts?

Si bien no es un gran problema, es simplemente más fácil de ser capaz de ver todo el código correspondiente en el mismo archivo. Gracias.

[operación -Editar-]

Gracias a todos los que respondieron - resulta que sólo tiene que definir todos los métodos anteriores el 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 conocer 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 principal()

Nuevamente, gracias a todos los que respondieron.

+0

Su respuesta se ve mejor que los demás a mí, ¿por qué no lo ponga como una respuesta y lo acepta (que es mejor que en una edición) – barlop

Respuesta

33

@ La respuesta de Hauleth es correcta: no hay ningún método o estructura de 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.Así que si usted tiene un proyecto muy pequeño y quiere que sea autónomo en un solo archivo, no hay absolutamente nada 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 dos primeros bloques no se ejecutan, es solo que no ves los efectos hasta que realmente usas la clase/método correspondiente.

El bit if __FILE__ == $0 es solo una forma de bloquear el código que solo desea ejecutar si este archivo se ejecuta directamente desde la línea de comandos. __FILE__ es el nombre del archivo actual, $0 es el comando que fue ejecutado por el shell (aunque es lo suficientemente inteligente como para soltar el ruby), por lo que comparar los dos le dice precisamente eso: ¿es este el archivo que se ejecutó desde el comando ¿línea? 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 usted quiere ser capaz de ejecutar el código directamente, puede añadir una línea

#!/usr/bin/env ruby 

# rest of somefile.rb 

shebang y que sea ejecutable con chmod +x somefile.rb (opcionalmente cambiar su nombre sin la extensión .rb). Esto realmente no cambia tu situación. El if __FILE__ == $0 todavía funciona y probablemente aún no sea necesario.

Editar

Como @steenslag señala correctamente, el alcance de nivel superior en Ruby es un Object llamado main. Tiene un comportamiento poco cobarde, sin embargo:

irb 
>> self 
=> main 
>> self.class 
=> Object 
>> main 
NameError: undefined local variable or method `main' for main:Object 
from (irb):8 

No se preocupe por esto hasta que empiece a cavar mucho más profundo en la lengua. Si haces querer aprender mucho más acerca de este tipo de cosas, Metaprogramming Ruby es una gran lectura :)

19

No, no hay tal estructura. Por supuesto, puede definir la función principal, pero no se invocará hasta que lo haga. Rubí ejecutar línea por línea por lo que si desea imprimir 'Hola mundo', se escribe:

puts 'Hello World' 

La pregunta que usted ha mencionado es sobre el uso de un archivo como módulo y ejecutable, por lo que si usted escribe

if __FILE__ == $0 
    # your code 
end 

Se ejecutará 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.

0

Si desea ejecutar scripts de Ruby como archivos compilados 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 clase y función no le darán ningún resultado hasta que sean instanciadas/invocadas (aunque el código dentro de las definiciones de clase realmente se evalúa , por lo que podría obtener algunos resultados, pero esto no se espera en circunstancias normales).

5

En realidad no es 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 
Cuestiones relacionadas