2012-12-18 10 views
5
में उच्च आदेश कार्य

मैं पायथन सीखने के बाद रूबी जानने के लिए अभी कोशिश कर रहा हूँ और मैं मुसीबत रूबी के लिए इस कोड का अनुवाद हो रही है:का उपयोग रूबी

def compose1(f, g): 
    """Return a function h, such that h(x) = f(g(x)).""" 
    def h(x): 
     return f(g(x)) 
return h 

मैं इस ब्लॉक का उपयोग अनुवाद करने के लिए है? या रूबी में एक समान वाक्यविन्यास है?

def f(x) 
    x + 2 
end 

def g(x) 
    x + 3 
end 

के रूप में हम compose1 परिभाषित कर सकते हैं:

def compose1(f,g) 
    lambda { |x| send(f, send(g, x)) } 
end 

इसके लिए काम करने के लिए, हम के रूप में ज परिभाषित करने की जरूरत:

+2

में आपका स्वागत है की उदाहरण। सावधानी बरतने का एक शब्द, "इस कोड को भाषा एक्स से भाषा वाई तक अनुवाद करें" आमतौर पर यहां पर अलोकप्रिय होते हैं। आपका सामान्य से थोड़ा बेहतर है क्योंकि ऐसा लगता है कि आपने थोड़ा सा खोला है और कुछ पता है कि आप क्या कर रहे हैं: "क्या मुझे ब्लॉक का उपयोग करके इसका अनुवाद करना है?"। उस ने कहा, मुझे उम्मीद है कि रूबी जानता है कि कोई भी साथ आता है और आपको एक अच्छा जवाब देता है - मुझे इस जवाब का जवाब नहीं लगेगा :-) – mgilson

+0

मैं पाइथन सीखने के बीच में हूं, इसलिए मैं जा रहा हूं इस के लिए कोड समाधान पोस्ट करने से दूर शर्मिंदा होना। लेकिन पाइथन/रूबी/पर्ल/PHP के बीच कोड का अनुवाद करने का प्रयास करते समय मैं इस संदर्भ मार्गदर्शिका की अत्यधिक अनुशंसा करता हूं (पर्ल-> पायथन का अनुवाद करने में मेरे लिए बहुत उपयोगी रहा है): http://hyperpolyglot.org/scripting – uptownnickbrown

+0

ओह, मेरा बुरा। मुझे निश्चित रूप से पता नहीं था कि अनुवाद प्रश्नों को देखा जाता है। मैं बस सोच रहा था कि पाइथन में समान वाक्यविन्यास है क्योंकि मेरे सभी Google परिणाम ब्लॉक का जिक्र कर रहे थे..लेकिन मैं इसे ध्यान में रखूंगा। धन्यवाद! – etabelet

उत्तर

3

कहना f और g निम्नलिखित तरीके हैं चलें h = compose1(:f, :g)

आपको कार्य करने के लिए send के लिए विधि नाम को स्ट्रिंग/प्रतीक के रूप में पास करने की आवश्यकता होगी। फिर, आप

h.call 3 # => 8 कर सकते हैं। अधिक जानकारी पाया जा सकता है here

+0

बिल्कुल सही! धन्यवाद! – etabelet

+0

मुझे लगता है कि यह उत्तर अधिक स्पष्ट है लेकिन ज़च केम्प का सुंदर है। – sunnyrjuneja

+0

जैच अच्छा है, लेकिन यह आपको उन परिवर्तनों के बिना मौजूदा तरीकों का उपयोग करने की अनुमति देता है, जो निश्चित रूप से इसके लाभ हैं। – TheDude

6

आप रूबी में lambdas के साथ ऐसा कर सकते हैं (मैं 1.9 Stabby-लैम्ब्डा यहाँ उपयोग कर रहा हूँ):

compose = ->(f,g) { 
    ->(x){ f.(g.(x)) } 
} 

तो compose एक समारोह एक और फ़ंक्शन कि, के रूप में है अपने उदाहरण:

f = ->(x) { x + 1 } 
g = ->(x) { x * 3 } 

h = compose.(f,g) 
h.(5) #=> 16 

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

2

उपयोग lambdas

def compose1(f,g) 
    return lambda{ |x| f.call(g.call(x)) } 
end 

चल StackOverflow को

compose1(lambda{|a| a + 1}, lambda{|b| b + 1}).call(1) 
+1

प्रोसेस और लैम्ब्डा एक अलग चीजें हैं (हालांकि समान)। आपने procs के बारे में लिखा लेकिन लैम्ब्स का इस्तेमाल किया। – skalee

+0

मान्य बिंदु .. संपादित .. –

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