`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?



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.


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

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

wird von Rubocop gegenüber diesem bevorzugt :

if __FILE__ == $0
    foo()
    bar()
end
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.