ถ้า __name__ == '__main __' เทียบเท่าใน Ruby


102

ฉันยังใหม่กับ Ruby ฉันต้องการนำเข้าฟังก์ชันจากโมดูลที่มีเครื่องมือที่ฉันต้องการใช้ต่อแยกต่างหาก ใน Python ฉันจะทำสิ่งนี้:

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

สิ่งนี้ทำให้ฉันสามารถรันโปรแกรมหรือนำเข้าเป็นโมดูลเพื่อใช้a()และ / หรือb()แยกกันได้ กระบวนทัศน์ที่เทียบเท่าใน Ruby คืออะไร?



อาจซ้ำกันได้ของRun a Ruby library จาก command-line
rogerdpack

คำตอบ:


132

จากทับทิมที่ฉันเคยเห็นในป่า (ได้รับไม่ใช่ตัน) นี่ไม่ใช่รูปแบบการออกแบบทับทิมมาตรฐาน โมดูลและสคริปต์ควรแยกจากกันดังนั้นฉันจะไม่แปลกใจเลยถ้าไม่มีวิธีการที่ดีและสะอาดในการทำเช่นนี้

แก้ไข: พบแล้ว

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

แต่มันไม่ธรรมดาแน่นอน


4
อะไรคือเหตุผลที่อยู่เบื้องหลังการแยกโมดูลและสคริปต์ออกจากความอยากรู้อยากเห็น?
Imagist

5
ฉันคิดว่ามันเป็นเพียงสิ่งที่ Rubyists ชอบทำ นิยามโมดูลคือนิยามโมดูล หากคุณต้องการดำเนินการบางอย่างกับโมดูลนั้นก็ใช้ได้ แต่สิ่งที่คุณกำลังทำนั้นไม่ใช่คำจำกัดความของโมดูล
Matchu

8
แม้ว่าจะมีประโยชน์สำหรับการทดสอบสิ่งต่าง ๆ - คุณสามารถทำการทดสอบโมดูลในนั้นและเรียกใช้จากไฟล์โมดูลโดยไม่ต้องมีกระดาษห่อหุ้ม
ebneter

3
@Imagist และ @ebneter หรือในทางกลับกันสคริปต์เป็นโมดูลเดียวที่ตั้งใจให้เรียกใช้จากบรรทัดคำสั่ง แต่คุณต้องการทดสอบเป็นส่วน ๆ และทำการทดสอบในโมดูลแยกต่างหาก ในกรณีนี้NAME == $ 0 เป็นสิ่งล้ำค่า
ความสับสน

16
ฉันไม่เคยเห็นสิ่งนี้ แต่ก็ไม่ได้ขมวดคิ้ว เอกสารอย่างเป็นทางการของ Ruby ใช้: ruby-lang.org/en/documentation/quickstart/4
cflewis

12

หากการติดตามสแต็กว่างเปล่าเราสามารถเริ่มดำเนินการทางขวาและซ้าย ฉันไม่รู้ว่ามันถูกใช้ตามอัตภาพหรือผิดปกติตั้งแต่ฉันเป็น Ruby มาประมาณหนึ่งสัปดาห์

if caller.length == 0
  # do stuff
end

หลักฐานแนวคิด:

ไฟล์: test.rb

#!/usr/bin/ruby                                                                 

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

puts "Test"

ไฟล์: shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

การใช้งาน:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test

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

เป็นที่ต้องการของRubocopมากกว่าสิ่งนี้:

if __FILE__ == $0
    foo()
    bar()
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.