`if __name__ == '__main __'` entspricht Ruby

101

Ich bin neu bei Ruby. Ich möchte Funktionen aus einem Modul importieren, das ein Tool enthält, das ich separat weiter verwenden möchte. In Python würde ich einfach Folgendes tun:

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

Dadurch kann ich das Programm ausführen oder als Modul zur Verwendung a()und / oder b()separat importieren . Was ist das äquivalente Paradigma in Ruby?

Imagist
quelle

Antworten:

130

Von dem Ruby, den ich in freier Wildbahn gesehen habe (zugegeben, keine Tonne), ist dies kein Standard-Ruby-Designmuster. Module und Skripte sollen getrennt bleiben, daher wäre ich nicht überrascht, wenn es dafür keine wirklich gute und saubere Möglichkeit gibt.

EDIT: Gefunden.

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

Aber es ist definitiv nicht üblich.

Matchu
quelle
4
Was ist der Grund dafür, Module und Skripte aus Neugier getrennt zu halten?
Imagist
5
Ich denke, es ist genau das, was Rubyisten bevorzugen. Eine Moduldefinition ist eine Moduldefinition. Wenn Sie mit diesem Modul etwas unternehmen möchten, ist das in Ordnung, aber die Aktion, die Sie ausführen, ist keine Moduldefinition.
Matchu
8
Es ist jedoch praktisch, um Dinge zu testen - Sie können dort Modultests einfügen und sie einfach aus der Moduldatei ohne Wrapper ausführen.
ebneter
3
@Imagist und @ebneter Oder umgekehrt: Das Skript ist ein einzelnes Modul, das über die Befehlszeile ausgeführt werden soll. Sie möchten es jedoch auch in Teilen testen und in einem separaten Modul testen können. In diesem Fall ist NAME == $ 0 von unschätzbarem Wert.
Verwirrung
16
Ich habe das auch nicht gesehen, aber es ist nicht verpönt. Die offiziellen Ruby-Dokumente verwenden es: ruby-lang.org/en/documentation/quickstart/4
cflewis
12

Wenn der Stack-Trace leer ist, können wir rechts und links mit der Ausführung beginnen. Ich weiß nicht, ob das konventionell oder unkonventionell verwendet wird, da ich ungefähr eine Woche lang bei Ruby bin.

if caller.length == 0
  # do stuff
end

Konzeptioneller Beweiß:

Datei: test.rb

#!/usr/bin/ruby                                                                 

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

puts "Test"

Datei: shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

Verwendung:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test
uKolka
quelle
0
if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 

wird von Rubocop gegenüber diesem bevorzugt :

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