2009-08-27 14 views
35

मेरे पास फैक्ट्री विधि के साथ एक स्क्रिप्ट है कि मैं जेआरबी या रूबी से स्क्रिप्ट चल रहा है या नहीं, इस पर निर्भर करता हूं कि मैं कुछ वर्ग के एक अलग कार्यान्वयन को वापस करना चाहता हूं। किसी के पास कोई विचार है कि मैं अपनी स्क्रिप्ट के अंदर से अंतर कैसे बता सकता हूं?मैं कैसे बता सकता हूं कि मैं जेआरबी बनाम रुबी से चल रहा हूं?

कुछ प्रारंभिक विचारों मैं थे: करने के लिए

  • प्रयास 'जावा शामिल' और वापस रूबी कार्यान्वयन के लिए बचाव अगर यह विफल रहता है। यह विधि काम नहीं करती है। रुबी का स्मार्ट मेरे प्रारंभ/बचाव/अंत के बावजूद त्रुटि करने के लिए पर्याप्त है।

  • प्रक्रिया आईडी के साथ कुछ मूर्खतापूर्ण करें। मैं इसके बजाय इससे बचूंगा, क्योंकि यह हमेशा एक हैक की तरह लगता है।

उत्तर

46

मेरा मानना ​​है कि आप RUBY_PLATFORM निरंतर जांच सकते हैं।

+1

हाँ। यह JRuby के तहत "जावा" और अंतर्निहित ओएस कहीं और है। वास्तव में – Chuck

+0

। मेरे लिए काफी अच्छा। आपका बहुत बहुत धन्यवाद! – pastorius

+0

@Chuck: सत्यापन के लिए धन्यवाद। मेरे पास JRuby इंस्टॉल आसान नहीं था। – JesperE

7

मुझे आपका प्रश्न बिल्कुल समझ में नहीं आता है। आप दो पूरी तरह से अलग अमूर्त स्तरों को मिलाते हुए प्रतीत होते हैं: रुबी एक प्रोग्रामिंग भाषा है, जेआरबी रूबी प्रोग्रामिंग भाषा के लिए एक कंपाइलर है। प्रश्न यह है कि आपका प्रोग्राम रूबी या जेआरबी में चल रहा है, सिर्फ सादा नहीं समझता है: जब यह जेआरबी में चल रहा है, तो रूबी में चल रहा है, क्योंकि जेआरबी रूबी का कार्यान्वयन है।

यह पूछने जैसा ही है "मैं कैसे बता सकता हूं कि मैं एक कार बनाम एक कार में गाड़ी चला रहा हूं?"

यदि आप जानना चाहते हैं कि आप किस रूबी कार्यान्वयन में चल रहे हैं, तो आप वैश्विक RUBY_ENGINE निरंतर जांच सकते हैं।

    कुछ इंजन पर
  1. यह नहीं आप क्या इंजन उस पर चल रहा है बताओ, उदाहरण के लिए,: यह, हालांकि यह दुर्भाग्य से तीन कारणों से विफल रहता है सार्वभौमिक और विशिष्ट रूप से इंजन आप पर चल रहे हैं की पहचान माना जाता है YARV पर मैं RUBY_ENGINE'yarv' होने की अपेक्षा करता हूं, लेकिन यह वास्तव में 'ruby' है। तो, यह "पहचान" भाग में विफल रहता है।
  2. भी बदतर: एमआरआई पर, यह भी'ruby' है, जिसका मतलब है कि न केवल यह आपको बता नहीं पड़ता कि इंजन आप पर चल रहे हैं, लेकिन वहां भी पूरी तरह से अलग इंजन है कि वापसी ही मूल्य। IOW, यह "अद्वितीय" भाग में भी विफल रहता है।
  3. और अंतिम लेकिन कम से कम नहीं, RUBY_ENGINE काफी नया है, इसलिए यह अभी तक सभी इंजनों द्वारा समर्थित नहीं है, जिसका अर्थ यह है कि यह "सार्वभौमिक" भाग में विफल रहता है।

फिर भी, अपने उद्देश्यों के लिए

if defined? RUBY_ENGINE && RUBY_ENGINE == 'jruby' 

की तरह कुछ ठीक काम करना चाहिए।

+0

परिभाषित अगर? RUBY_ENGINE और RUBY_ENGINE == 'jruby' –

+0

अपने समानता का उपयोग करने के लिए, कभी-कभी आपको यह जानना होगा कि आपकी कार एक फोर्ड है या नहीं। उदाहरण के लिए आपको कई लोगों को यह जानने की ज़रूरत है कि क्या आप किसी देशी एक्सटेंशन का समर्थन करना चाहते हैं जो आपके कोड में jruby द्वारा समर्थित नहीं है। – Will

+0

अपेक्षाकृत नया RUBY_ENGINE के बारे में अच्छा बिंदु। क्या JRuby का एक पुराना संस्करण था जिसमें यह नहीं था? – Trejkaz

40

जैसा कि पहले से ही कहा गया है, JRuby का पता लगाने के कई तरीके हैं।यहाँ पूरी सूची वरीयता के अनुसार क्रमबद्ध है:

  1. सरल और सीधा:

    RUBY_PLATFORM == "java" 
    
  2. यह रूप में अच्छी तरह अन्य impls के लिए इस्तेमाल किया जा सकता है। नकारात्मकता यह है कि एमआरआई 1.8.6 और 1.8.7 अभी तक RUBY_ENGINE का समर्थन नहीं करते हैं, इसलिए हमें परिभाषित करने की आवश्यकता है? जाँच:

    if defined? JRUBY_VERSION 
    

    JRUBY_VERSION केवल JRuby में और में परिभाषित किया गया है कम प्रदान करता है:

    if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' 
    
  3. तुम सिर्फ चाहे वह JRuby या नहीं है की तुलना में थोड़ा और अधिक जानना चाहते हैं संस्करण जानकारी, जैसे "1.5.0.dev"

  4. सबसे पसंदीदा तरीका: 'जावा' की आवश्यकता होती है या 'जर्बी' और बचाव की आवश्यकता होती है। इस्तेमाल नहीं किया जाना चाहिए।

+2

दरअसल, आपको दूसरे संस्करण के लिए कोष्ठक प्रदान करना होगा, इसलिए यदि परिभाषित किया गया तो यह होगा? (RUBY_ENGINE) && RUBY_ENGINE == 'jruby' –

+1

धन्यवाद, @ टायलर, वास्तव में यह एक मूर्ख गलती थी, सही! – vsizikov

+0

अंतिम विकल्प उतना बुरा नहीं है जितना लगता है। यदि आप जेआरबी के लिए परीक्षण करने जा रहे थे और फिर 'जावा' की आवश्यकता होती है (और यदि आप नहीं थे, तो इसका सामना करते हैं, क्यों JRuby का पता लगाने की परेशानी क्यों होती है), फिर बचाव जोड़ना इतना बुरा नहीं लगता है। – Trejkaz

1

आप खोल, आईआरबी, RVM या प्लगइन रूबी पाठ संपादक प्लगइन्स की तरह किसी प्रकार की डिबगिंग रहे हैं मैं और अधिक वर्बोज़ RUBY_DESCRIPTION पसंद करते हैं।

आप कुछ के आधार पर आप JRuby या नहीं चला रहे हैं कोड को चलाने के लिए प्रयास कर रहे हैं, अन्य टिप्पणी की स्थिरांक अच्छा कर रहे हैं: RUBY_ENGINE, JRUBY_VERSION या RUBY_PLATFORM

संबंधित मुद्दे

 संबंधित मुद्दे