2013-10-25 16 views
8

रूबी पर इस लाइन को कम करने का कोई तरीका है?रिटर्न स्टेटमेंट

if (res = bla_permission_invalid).is_a? String then return res end 

def something # many things that like this 
    if (res = bla_permission_invalid).is_a? String then return res end 
    # do something else 
    return true 
end 

पर

जब bla_permission_invalid की सामग्री की तरह

def bla_permission_invalid 
    return invalid_address_report_func if invalid_address? 
    return permission_error_report_func if @user.not_one_of? [ :group1, :group2 ] 
    return nil 
end 

invalid_adress_report_func और permission_error_report_func रिटर्न स्ट्रिंग कुछ

+4

ऐसा लगता है कि इस कोड की तरह अपवाद को बदलने की कोशिश कर रहा है ... –

उत्तर

4

अगर p ossible मूल्यों String और NilClass हैं, तो कोड यह करने के लिए सरल किया जा सकता:

def something 
    res = bla_permission_invalid() 
    return res if res # strings are truthy, so they'll be returned but nil will proceed 

    # do something else 
    true 
end 
+0

'res res अगर res res' को बदलने का कोई तरीका है क्योंकि 'res' यहां दोहराया गया है? – hlcs

+0

@hlcs: मेरे सिर के ऊपर से - नहीं। –

5
def something 
    bla_permission_invalid || (
    # do something else 
    true) 
end 
+0

आप यहाँ 'return' की जरूरत नहीं है:

अपवाद को संभालने के लिए। और मुझे पढ़ने के लिए इस तरह के कोड ब्लॉक मिलते हैं। लेकिन यह काम करेगा। –

+0

ने उत्तर दिया – tihom

2

मस्ती के लिए, एक इस तरह से अपनी something विधि पुनर्लेखन सकता है:

def something 
    true.tap do 
    bla_permission_invalid.tap { |res| return res if res.is_a? String } 
    # do something else (thx Sergio) 
    end 
end 

लेकिन अधिक महत्वपूर्ण बात, मार्क थॉमस श्रेय उनके अवलोकन के लिए, हाथ में समस्या को कस्टम अपवादों का उपयोग करके हल किया जाना चाहिए।

त्रुटि कोड दृष्टिकोण उन भाषाओं में अच्छा है जिनमें अपवाद नहीं हैं। रूबी उन्हें है।

+0

"कुछ और करें" भाग कहां है? :) –

+0

अब ओओपी का एक हिस्सा अपवाद कैसे हैं? यह एक पूरी तरह से असंबंधित अवधारणा है ("त्रुटि कोड" बनाम "अपवाद") –

+0

@ सर्वियो टुलेंटसेव: चीजें पहले से ही मेरे सिर में उलझन में आ रही हैं, और मैंने अभी तक बोमोर बोतल भी नहीं खोल दी है। अगर मैं यह कहकर बयान अलग करता हूं कि: 1. "मूल कोड बहुत से प्रश्न पूछता है, 'बताओ, सिद्धांत न पूछें' सिद्धांत का उल्लंघन करता है, जो अधिक से अधिक संतुष्ट हो सकता है, और 2." मार्क थॉमस मर चुका है उनका अवलोकन कि यह अपवादों का मामला है ", क्या यह बेहतर है? मुझे ज्यादा अनुमान नहीं है। एक जीवविज्ञानी के रूप में, मैं बस प्रोग्रामिंग में पर्याप्त पेशेवर नहीं हूं, आप वहां सीएस प्रमुख हैं, मेरी भावनाओं को व्यक्त करने में मेरी मदद करें, कृपया! –

1

मार्क थॉमस पहले से ही his comment में नोट किया गया है कि ऐसा लगता है कि आप किसी प्रकार के स्ट्रिंग पहचानकर्ता का उपयोग करके स्वयं को त्रुटियों को संभालने का प्रयास कर रहे हैं। आप अपवादों के बजाय इस्तेमाल कर सकते हैं:

class AddressError < StandardError; end 
class PermissionError < StandardError; end 

def something 
    bla_permission_invalid 
    # do something 
    true 
end 

def bla_permission_invalid 
    raise AddressError if invalid_address? 
    raise PermissionError if @user.not_one_of? [ :group1, :group2 ] 
end 

ऊपर कोड somethingbla_permission_invalid कहता है, करता है अपने काम और true रिटर्न में। यदि bla_permission_invalid में कोई अपवाद उठाया गया है, तो यह स्वचालित रूप से कॉल स्टैक को प्रचारित करता है, आपको इसे something से स्पष्ट रूप से वापस नहीं करना है।

begin 
    something 
rescue AddressError 
    # handle address error 
rescue PermissionError 
    # handle permission error 
end 
+0

और मुझे अभी टिप्पणी करने दें कि 'raise' के पास एक लोकप्रिय उपनाम 'असफल' है, इसलिए अगर अवैध_एड्रेस अगर पता है तो पता लगाने के बजाय, हम अवैध_ड्रेस अगर पता त्रुटि विफल कर सकते हैं? –

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