2008-10-30 11 views
6

मुझे लगता है मैं कर रहा हूँ विकासशील एक कमांड लाइन रूबी ऐप है और मुझे लगता है कि इस प्रक्रिया की ओर से एक फिल्टर के रूप में चलेंगे कोड प्रदान करने के लिए इसके बारे में एक उपयोगकर्ता की अनुमति देना चाहते। मूल रूप से, आवेदन करता है:स्क्रिप्ट एक रूबी कमांड लाइन ऐप; ऐसा करने का सबसे अच्छा तरीका है?

  1. कुछ डेटा में पढ़ा
  2. एक फिल्टर निर्दिष्ट किया जाता है, तो यह डेटा

मैं फ़िल्टर करने की प्रक्रिया चाहते हैं फिल्टर करने के लिए डेटा

  • प्रक्रिया का उपयोग (कदम 2) जितना संभव हो उतना लचीला होना।

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

    # user's filter 
    
    class MyFilter 
        def do_filter(array_to_filter) 
        filtered_array = Array.new 
        # do my filtering on array_to_filter 
        filtered_array 
    end 
    
    FILTER = MyFilter.new 
    

    मेरे ऐप्लिकेशन के कोड तो कुछ इस तरह करना होगा:

    array_that_might_get_filtered = get_my_array() 
    if (options.filter_file) 
        require options.filter_file 
        array_that_might_get_filtered = FILTER.do_filter(array_that_might_get_filtered) 
    end 
    

    हालांकि यह काम करेगा, यह चीज लगता है और ऐसा लगता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए। मैं भी फिल्टर एक ज्ञात वर्ग के लिए एक ज्ञात नाम की एक विधि को जोड़ने के रूप में हो होने की सोची, परन्तु जो पूरी तरह ठीक नहीं लगता था, या तो।

    इसके लिए रूबी में एक बेहतर मुहावरा है?

  • उत्तर

    4

    मैं सिर्फ कमांड लाइन, और सम्मेलन के संयोजन का उपयोग होगा।

    एक फिल्टर निर्दिष्ट है, तो इसका इस्तेमाल डेटा

    मैं तुम्हें कमांड लाइन पर एक फिल्टर निर्दिष्ट करें संभालने हूँ फिल्टर करने के लिए? तो आप इस तरह के आवेदन का आह्वान करेंगे?

    ruby dataprocessor.rb custom_filter 
    

    यदि हां, तो आप एक "API" जिसमें एक वर्ग के नाम से मिलाने के लिए में पारित किया गया था के लिए होता है निर्धारित कर सकते हैं - काफी वास्तव में कैसे आप अपने उदाहरण में वर्णन किया है।

    एक कदम आगे ही यह लेने के लिए आपको कुछ तर्क जो माणिक के defined? का उपयोग कर CustomFilter वर्ग के लिए देखा हो सकता था, और अगर यह नहीं मिला था, custom_filter.rb की तलाश में जाना (या किसी भी उपयुक्त बदलाव के) और उस फ़ाइल को लोड करने का प्रयास , फिर पुनः प्रयास करें।

    यह आपको महान तानाना देता है के रूप में आप की तरह के रूप में आप के रूप में कई फिल्टर वर्गों लिखते हैं, उन्हें अपने स्वयं के .rb फ़ाइलों में चक कर सकते हैं, और उन्हें कहीं भी रख कि माणिक उन्हें पा सकते हैं। आप एक पूर्व निर्धारित स्थिरांक या तो नहीं होगा, केवल कमी

    1. वर्ग के नाम (का एक प्रकार) से मेल खाना चाहिए नाम होगा - यह गहरे लाल रंग का में सम्मेलन ताकि आप शायद पहले से ही कर रहे हैं है वैसे भी कर रहे हैं।
    2. यह इस तरह अपने do_filter विधि

    संयोग के रूप में कुछ पूर्वनिर्धारित विधि, होना आवश्यक है, यह बहुत क्या रेल अपने मॉडल की आवश्यकता होती है के लिए करता है के समान है, और यही कारण है कि तुम सिर्फ बिना SomeModel उपयोग कर सकते हैं हमेशा require app/models/some_model करने के लिए पहले :-) `

    +0

    बहुत मेरी सामान्य जवाब से अधिक व्यावहारिक। +1 – VonC

    0

    Strategy Pattern के लिए नौकरी की तरह दिखता है, और चूंकि रूबी functions as first-class objects है, तो आप मांग पर उस कस्टम फ़िल्टर फ़ंक्शन को आमंत्रित करने के लिए, फ़िल्टर फ़ंक्शन को सरणी द्वारा याद किया जा सकता है।

    0
    # user code 
    USER_FILTER = lambda { |value| value != 0xDEADBEEF } 
    
    # script code 
    load(user_code); 
    FILTER = (const_defined?(:USER_FILTER) ? USER_FILTER : lambda { true }) 
    
    output_array = input_array.filter(&FILTER) 
    
    संबंधित मुद्दे