`jika __name__ == '__main __' 'setara di Ruby

101

Saya baru mengenal Ruby. Saya ingin mengimpor fungsi dari modul yang berisi alat yang ingin saya terus gunakan secara terpisah. Dengan Python saya hanya akan melakukan ini:

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

Ini memungkinkan saya untuk menjalankan program atau mengimpornya sebagai modul untuk digunakan a()dan / atau b()secara terpisah. Apa paradigma yang setara di Ruby?

Imagist
sumber
kemungkinan duplikat Jalankan pustaka Ruby dari baris perintah
Andrew Grimm
Kemungkinan duplikat Jalankan pustaka Ruby dari baris perintah
rogerdpack

Jawaban:

130

Dari Ruby yang saya lihat di alam liar (memang, bukan satu ton), ini bukan pola desain Ruby standar. Modul dan skrip seharusnya tetap terpisah, jadi saya tidak akan terkejut jika tidak ada cara yang baik dan bersih untuk melakukan ini.

EDIT: Ketemu.

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

Tapi itu jelas tidak umum.

Matchu
sumber
4
Apa alasan di balik memisahkan modul dan skrip, karena penasaran?
Imagist
5
Saya pikir itu yang lebih suka dilakukan oleh Rubyist. Definisi modul adalah definisi modul. Jika Anda ingin mengambil tindakan dengan modul itu, baiklah, tetapi tindakan yang Anda lakukan bukanlah definisi modul.
Matchu
8
Ini berguna, meskipun, untuk menguji berbagai hal - Anda dapat menempatkan tes modul di sana dan menjalankannya hanya dari file modul tanpa pembungkus apa pun.
ebneter
3
@Imagist dan @ebneter Atau sebaliknya: skrip adalah modul tunggal yang dimaksudkan untuk dijalankan dari baris perintah, tetapi Anda juga ingin dapat mengujinya di beberapa bagian dan melakukan pengujian dalam modul terpisah. Dalam hal ini, NAME == $ 0 sangat berharga.
Kebingungan
16
Aku juga belum pernah melihat ini, tapi tidak disukai. Dokumen resmi Ruby menggunakannya: ruby-lang.org/en/documentation/quickstart/4
cflewis
12

Jika jejak tumpukan kosong, kita bisa mulai mengeksekusi ke kanan dan kiri. Saya tidak tahu apakah itu digunakan secara konvensional atau tidak konvensional karena saya menggunakan Ruby selama sekitar satu minggu.

if caller.length == 0
  # do stuff
end

Bukti dari konsep:

file: test.rb

#!/usr/bin/ruby                                                                 

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

puts "Test"

file: shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

Pemakaian:

$ ./shmest.rb 
Test
Shmest

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

lebih disukai oleh Rubocop daripada ini:

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