`if __name__ == '__main __'` équivalent en Ruby

101

Je suis nouveau sur Ruby. Je cherche à importer des fonctions à partir d'un module contenant un outil que je souhaite continuer à utiliser séparément. En Python, je ferais simplement ceci:

def a():
    ...
def b():
    ...
if __name__ == '__main__':
    a()
    b()

Cela me permet d'exécuter le programme ou de l'importer en tant que module à utiliser a()et / ou b()séparément. Quel est le paradigme équivalent dans Ruby?

Imagiste
la source
duplication possible de Run a Ruby library à partir de la ligne de commande
Andrew Grimm
Copie

Réponses:

130

Du Ruby que j'ai vu dans la nature (d'accord, pas une tonne), ce n'est pas un modèle de conception Ruby standard. Les modules et les scripts sont censés rester séparés, donc je ne serais pas surpris qu'il n'y ait pas vraiment une bonne façon propre de faire cela.

EDIT: Je l'ai trouvé.

if __FILE__ == $0
    foo()
    bar()
end

Mais ce n'est certainement pas courant.

Matchu
la source
4
Quel est le raisonnement derrière la séparation des modules et des scripts, par curiosité?
Imagist
5
Je pense que c'est exactement ce que les rubisistes préfèrent faire. Une définition de module est une définition de module. Si vous souhaitez effectuer une action avec ce module, très bien, mais l'action que vous effectuez n'est pas une définition de module.
Matchu
8
C'est pratique, cependant, pour tester des choses - vous pouvez y placer des tests de module et les exécuter uniquement à partir du fichier de module sans aucun wrapper.
ebneter
3
@Imagist et @ebneter Ou l'inverse: le script est un module unique qui est destiné à être exécuté à partir de la ligne de commande, mais vous voulez également pouvoir le tester par parties et avoir le test dans un module séparé. Dans ce cas, NOM == $ 0 est inestimable.
Confusion
16
Je n'ai pas vu cela non plus, mais ce n'est pas mal vu. La documentation officielle de Ruby l'utilise: ruby-lang.org/en/documentation/quickstart/4
cflewis
12

Si la trace de la pile est vide, nous pouvons commencer à exécuter à droite et à gauche. Je ne sais pas si c'est utilisé de manière conventionnelle ou non puisque je suis dans Ruby depuis environ une semaine.

if caller.length == 0
  # do stuff
end

Preuve de concept:

fichier: test.rb

#!/usr/bin/ruby                                                                 

if caller.length == 0
  puts "Main script"
end

puts "Test"

fichier: shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

Usage:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test
uKolka
la source
1
if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 

est préféré par Rubocop à ceci:

if __FILE__ == $0
    foo()
    bar()
end
ablarg
la source