web-dev-qa-db-fra.com

Existe-t-il une méthode "principale" en Ruby comme en C?

Je suis nouveau chez Ruby, donc excuses si cela semble vraiment idiot.

Je n'arrive pas à comprendre comment écrire un code "principal" et avoir des méthodes dans le même fichier (similaire à C). Je me retrouve avec un fichier "principal" qui charge un fichier séparé qui a toutes les méthodes. J'apprécie tout conseil à ce sujet.

J'ai repéré le SO post mais je ne le comprends pas: Dois-je définir une méthode principale dans mes Ruby scripts?

Bien que ce ne soit pas un gros problème, il est simplement plus facile de voir tout le code pertinent dans le même fichier. Je vous remercie.

[-ÉDITER-]

Merci à tous ceux qui ont répondu - il vous suffit de définir toutes les méthodes au-dessus du code. Un exemple est ci-dessous:

def callTest1
    puts "in test 1"
end

def callTest2
    puts "in test 2" 
end

callTest1
callTest2

Je pense que cela a du sens car Ruby doit connaître toutes les méthodes à l'avance. Ce n'est pas comme C où il y a un fichier d'en-tête qui répertorie clairement les fonctions disponibles et peut donc les définir sous le principal () une fonction

Encore merci à tous ceux qui ont répondu.

37
rchn

@ La réponse de Hauleth est correcte: il n'y a ni méthode ni structure main dans Ruby. Je veux juste fournir ici une vue légèrement différente avec quelques explications.

Lorsque vous exécutez Ruby somefile.rb, Ruby exécute tout le code dans somefile.rb. Donc, si vous avez un très petit projet et que vous souhaitez qu'il soit autonome dans un seul fichier, il n'y a absolument rien de mal à faire quelque chose comme ceci:

# 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

Ce n'est pas que les deux premiers blocs ne sont pas exécutés, c'est juste que vous ne voyez pas les effets jusqu'à ce que vous utilisiez réellement la classe/méthode correspondante.

Le if __FILE__ == $0 bit n'est qu'un moyen de bloquer le code que vous souhaitez exécuter uniquement si ce fichier est exécuté directement à partir de la ligne de commande. __FILE__ est le nom du fichier actuel, $0 est la commande qui a été exécutée par le shell (bien qu'elle soit suffisamment intelligente pour supprimer le Ruby), donc la comparaison des deux vous indique précisément que: est-ce le fichier qui a été exécuté à partir de la ligne de commande? Cela est parfois fait par des codeurs qui souhaitent définir une classe/module dans un fichier et également fournir un utilitaire de ligne de commande qui l'utilise. À mon humble avis, ce n'est pas une très bonne structure de projet, mais comme tout, il existe des cas d'utilisation où le faire est parfaitement logique.

Si vous voulez pouvoir exécuter votre code directement, vous pouvez ajouter une ligne Shebang

#!/usr/bin/env Ruby

# rest of somefile.rb

et le rendre exécutable avec chmod +x somefile.rb (éventuellement renommez-le sans l'extension .rb). Cela ne change pas vraiment votre situation. Le if __FILE__ == $0 fonctionne toujours et n'est probablement pas nécessaire.

Modifier

Comme le souligne @steenslag correctement, la portée de niveau supérieur dans Ruby est un Object appelé main. Il a un comportement légèrement funky, cependant:

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

Ne vous inquiétez pas jusqu'à ce que vous commenciez à creuser beaucoup plus profondément dans la langue. Si vous faites voulez en savoir plus sur ce genre de choses, Metaprogramming Ruby est une bonne lecture :)

37
dantswain

Non, il n'y a pas une telle structure. Bien sûr, vous pouvez définir la fonction principale, mais elle ne sera appelée que lorsque vous le ferez. Ruby exécutez ligne par ligne donc si vous voulez imprimer 'Hello World' vous écrivez simplement:

puts 'Hello World'

La question que vous avez mentionnée concerne l'utilisation d'un fichier comme module et exécutable, donc si vous écrivez

if __FILE__ == $0
  # your code
end

Il sera appelé uniquement si vous exécutez ce fichier. Si vous ne l'exigez que dans un autre fichier, ce code ne s'exécutera jamais. Mais à mon humble avis, c'est une mauvaise idée, la meilleure option est d'utiliser RubyGems et d'y ajouter des exécutables.

22
Hauleth

En fait, il existe un main, mais ce n'est pas une méthode; c'est l'objet de niveau supérieur qui est le contexte d'exécution initial d'un programme Ruby.

class Foo
  p self
end
#=> Foo

p self
#=> main

def foo 
  p self
end
foo
#=> main
6
steenslag

Il n'y a pas de fonction principale magique dans Ruby. Voir http://en.wikipedia.org/wiki/Main_function#Ruby

1
Alexander

Si vous souhaitez exécuter Ruby scripts comme les fichiers compilés C, procédez comme suit:

#!/usr/bin/env Ruby
puts "Hello"

puis chmod a+x file_name.rb. Tout ce qui est en dessous de la première ligne sera exécuté, comme s'il s'agissait du contenu de main en C. Bien sûr, les définitions de classe et de fonction ne vous donneront aucun résultat tant qu'elles ne seront pas instanciées/invoquées (bien que le code à l'intérieur les définitions de classe sont en fait évaluées, vous pouvez donc obtenir une sortie mais cela n'est pas prévu dans des circonstances normales).

1
Aleksander Pohl