2012-04-25 13 views
40

से कॉल रूबी फ़ंक्शन कमांड लाइन से मैं सीधे रूबी फ़ंक्शन कैसे कॉल कर सकता हूं?कमांड लाइन

कल्पना कीजिए, मैं इस स्क्रिप्ट test.rb होगा:

class TestClass 
    def self.test_function(some_var) 
     puts "I got the following variable: #{some_var}" 
    end 
end 

इस स्क्रिप्ट कमांड लाइन (ruby test.rb) से चलाया जाता है (के रूप में इरादा), कुछ नहीं होता।

क्या ruby test.rb TestClass.test_function('someTextString') जैसी कोई बात है? मैं निम्नलिखित आउटपुट प्राप्त करना चाहता हूं: I got the following variable: someTextString

उत्तर

74

पहले कक्षा के नाम को पूंजी पत्र से शुरू करने की आवश्यकता है, और चूंकि आप वास्तव में एक स्थिर विधि का उपयोग करना चाहते हैं, तो फ़ंक्शन नाम परिभाषा को self. से शुरू करने की आवश्यकता है।

class TestClass 
    def self.test_function(someVar) 
     puts "I got the following variable: " + someVar 
    end 
end 

फिर आह्वान करने के लिए है कि कमांड लाइन से आप कर सकते हैं:

ruby -r "./test.rb" -e "TestClass.test_function 'hi'" 

तो आप के बजाय एक उदाहरण विधि के रूप में test_function था, तो आप होगा:

class TestClass 
    def test_function(someVar) 
     puts "I got the following variable: " + someVar 
    end 
end 

तो आप इसे इसके साथ आमंत्रित करें:

ruby -r "./test.rb" -e "TestClass.new.test_function 'hi'" 
+9

+1 :)। इसके अलावा। विधियों और चर नामों के लिए CamelCase गैर रूबी शैली हैं। अंडरसर का प्रयोग करें: 'test_function',' some_var' – fl00r

+0

@ fl00r अच्छा बिंदु! मैंने जवाब अपडेट किया। – Candide

+0

एकाधिक पैरामीटर के लिए @lunero द्वारा जवाब [http://stackoverflow.com/a/37948278/1245614) देखें – skitheo

2

यदि आप कमांड लाइन इंटरफ़ेस पर काम कर रहे हैं, तो मैं thor पर एक नज़र डालने का सुझाव दूंगा।

थोर सीधे आपके आदेशों को परिभाषित कक्षा के भीतर तरीकों से मानचित्रित करता है, उदाहरण के लिए thor wiki देखें।

11

यदि आप पाते हैं कि कमांड लाइन पर टाइपिंग रूबी सिंटैक्स अजीब है और आप वास्तव में रूबी को तर्क देना चाहते हैं तो यह एक और भिन्नता है।

#!/usr/bin/env ruby 

class TestClass 
    def self.test_function(some_var) 
    puts "I got the following variable: #{some_var}" 
    end 
end 

TestClass.test_function(ARGV[0]) 

test.rb निष्पादन करें और इस तरह से इसे चलाने:

./test.rb "Some Value" 

या इस तरह इसे चलाने:

ruby test.rb "Some Value" 

यह काम करता है क्योंकि गहरे लाल रंग का स्वतः निर्धारित यहाँ test.rb है स्क्रिप्ट को पारित तर्कों के लिए ARGV सरणी। पहला तर्क प्राप्त करने के लिए आप ARGV[0] या ARGV.first का उपयोग कर सकते हैं, या ARGV.join(' ') का उपयोग करके, आप रिक्त स्थान से अलग एक स्ट्रिंग में तर्क जोड़ सकते हैं।

यदि आप बहुत सी कमांड लाइन सामग्री कर रहे हैं, तो अंत में आप Shellwords के लिए उपयोग कर सकते हैं, जो मानक रूबी lib में है।

+1

आमतौर पर आप शीर्ष-स्तरीय कोड को 'if __FILE__ == $ 0' में लपेटेंगे। –

3
#!/usr/bin/env ruby 

class A 
    def run 
    p :Hello_world 
    end 
    self 
end.new.run 

स्क्रिप्ट रूबी के लिए हमेशा की तरह सिर्फ शीर्ष स्तर निष्पादन वातावरणमुख्य बुलाया उपयोग करने के लिए है। आप बस कक्षा के बाहर लिखने वाले तरीकों और कोड को परिभाषित करना शुरू कर सकते हैं, और इन्हें सीधे निष्पादित किया जाएगा। (बीटीडब्लू, एक वर्ग के अंदर कोड लेकिन किसी भी विधि के बाहर "स्वयं ही" चलाएगा।)

वैसे भी, मैं आपके साथ हूं ... मुझे एक नामित कक्षा में सभी कोड लिखना और उस कक्षा को तुरंत चालू करना पसंद है, ताकि आप तकनीकों को जोड़ सकें .. क्या कक्षा अपनी वस्तु वापस कर दे .. और फिर बस उपयोग करें आवंटित करने, प्रारंभ करने, और फिर कक्षा में डॉट करने के लिए उस शीर्ष स्तर कोड का एक छोटा सा कोड।

इसके साथ, आप बस $ ruby test.rb टाइप कर सकते हैं और यह वही करेगा जो आप चाहते हैं। या आप कर सकते हैं क्योंकि हमने add a shebang.

0

इस मामले के लिए इंजेनु के उत्तर का सिर्फ एक विस्तार है कि फ़ंक्शन कुछ प्रिंट नहीं करता है, लेकिन कुछ वापस करता है।

हम निम्नलिखित test.rb

class TestClass 
    def self.test_function(some_var) 
     return "I got the following variable: " + some_var 
    end 
end 

तो कमांड लाइन से आह्वान करने के लिए है और जो आपके द्वारा दिया गया मान मिलेगा:

ruby -r "./test.rb" -e "puts TestClass.test_function('hi')" 
2

आप में कॉल करने के लिए कई तर्क है, तो इस तरह का एक उदाहरण:

class TestClass 
    def self.test_function(some_var1, some_var2) 
    puts "I got the following variables: #{some_var1}, #{some_var2}" 
    end 
end 

इसे थिय की तरह चलाएं रों

ruby -r "./test.rb" -e "TestClass.new.test_function 'hi','Mike'" 
+0

यह बहुत अच्छा है क्योंकि प्रारंभिक उत्तर में 2 तर्क शामिल नहीं थे। – camdixon

0

आप जानते हैं कि कैसे कमांडलाइन

से एक rb फ़ाइल कॉल करने के लिए यह आप के लिए पूरी चाल कर सकते हैं (तर्क इस मामले में अलग अल्पविराम होने की जरूरत है)।

आपने जो किया है, वह कक्षा में आपके तरीकों को परिभाषित करता है। अब आप इसे परिभाषा के नीचे बुला सकते हैं। यदि आप अभी भी पढ़ना चाहते हैं, तो अपनी आंखें खोलें

class TestClass 
    def self.test_function(some_var) 
    puts "I got the following variable: #{some_var}" 
    end 
    test_function(var) 
end