2016-09-06 8 views
6

मेरे पास एक तरीका है जहां मैं तय करना चाहता हूं कि मानचित्र फ़ंक्शन में क्या लौटना है। मुझे पता है कि यह एक चर निर्दिष्ट करने के साथ किया जा सकता है, लेकिन इस तरह मैं इसे कर सकता था;`वापसी` # मानचित्र

def some_method(array) 
    array.map do |x| 
     if x > 10 
     return x+1 #or whatever 
     else 
     return x-1 
     end 
    end 
end 

के रूप में मैं उम्मीद क्योंकि पहली बार return मारा जाता है, यह विधि से देता है, और नक्शा समारोह, कैसे वापसी जावास्क्रिप्ट का नक्शा समारोह में प्रयोग किया जाता है के समान नहीं यह काम नहीं करता।

क्या मेरे वांछित वाक्यविन्यास को प्राप्त करने का कोई तरीका है? या मैं एक चर को यह निर्दिष्ट करते हैं और इस तरह अंत में फांसी इसे छोड़ करने की आवश्यकता है:

def some_method(array) 
    array.map do |x| 
     returnme = x-1 
     if x > 10 
     returnme = x+1 #or whatever 
     end 
     returnme 
    end 
end 

उत्तर

12

आप चर जरूरत नहीं है। ब्लॉक का रिटर्न वैल्यू उसमें मूल्यांकन की गई अंतिम अभिव्यक्ति का मूल्य है। इस मामले में, if

def some_method(array) 
    array.map do |x| 
     if x > 10 
     x+1 
     else 
     x-1 
     end 
    end 
end 

टर्नरी ऑपरेटर अच्छा लगेगा, मुझे लगता है। अधिक अभिव्यक्ति-आश।

def some_method(array) 
    array.map do |x| 
    (x > 10) ? x+1 : x-1 
    end 
end 

आप return के प्रयोग पर जोर देते हैं, तो आप lambdas इस्तेमाल कर सकते हैं। लैम्बडास में, return सामान्य तरीकों से व्यवहार करता है।

def some_method(array) 
    logic = ->(x) { 
    if x > 10 
     return x + 1 
    else 
     return x - 1 
    end 
    } 
    array.map(&logic) 
end 

हालांकि यह फॉर्म शायद ही कभी देखा जाता है। यदि आपका कोड छोटा है, तो निश्चित रूप से इसे अभिव्यक्ति के रूप में पुनः लिखा जा सकता है। यदि आपका कोड कई निकास बिंदुओं को वारंट करने के लिए काफी लंबा और जटिल है, तो शायद आपको इसे सरल बनाने का प्रयास करना चाहिए।

+0

अच्छा! मुझे अपने कोड को थोड़ा सा काम करना पड़ा, लेकिन मेरा मानना ​​है कि यह एक अच्छा समाधान है! – Automatico

+1

@ कॉर्ट 3z: अद्यतन उत्तर देखें :) –

15

सर्जियो का जवाब बहुत अच्छा है, लेकिन यह उनका कहना है कि वहाँ एक कीवर्ड कि जिस तरह से आप return काम करना चाहता था काम करता है लायक है: next

array.map do |x| 
    if x > 10 
    next x + 1 
    else 
    next x - 1 
    end 
end 

यह next का एक बहुत अच्छा उपयोग करते हैं, क्योंकि जैसा कि सर्जियो ने कहा, तुम वहाँ कुछ नहीं चाहिए नहीं है। हालांकि, आप इसे अधिक स्पष्ट रूप से व्यक्त करने के लिए next का उपयोग कर सकते हैं:

array.map do |x| 
    next x + 1 if x > 10 
    x - 1 
end 
+1

यह अच्छा है! मेरा वास्तविक कोड उपरोक्त मेरे उदाहरण की तुलना में थोड़ा अधिक संकलित है, इसलिए 'अगला' एक बहुत अच्छा समाधान हो सकता है। व्यक्तिगत रूप से मुझे यह सब "डिफ़ॉल्ट रूप से जादू" रूबी के व्यवहार को पसंद नहीं है। स्पष्ट रूप से यह बताने के लिए अच्छा है कि क्या हो रहा है, इसलिए अगले व्यक्ति को इसे चुनना आसान है। – Automatico

+0

एक बेहतर जवाब! –

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