2009-03-20 6 views
56

रुबी में पाइप के प्रतीक क्या हैं?रुबी में उन पाइप प्रतीकों के लिए क्या हैं?

मैं रूबी और आतंक विरोधी सीख रहा हूँ, एक PHP और जावा पृष्ठभूमि से आ रही है, लेकिन मैं इस तरह कोड भर में आते हैं:

def new 
    @post = Post.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.xml { render :xml => @post } 
    end 
end 

|format| हिस्सा क्या कर रहा है? PHP/जावा में इन पाइप प्रतीकों के बराबर वाक्यविन्यास क्या है?

उत्तर

42

वे ब्लॉक में दिए गए चर हैं।

def this_method_takes_a_block 
    yield(5) 
end 

this_method_takes_a_block do |num| 
    puts num 
end 

कौन सा आउटपुट "5" है। एक और आर्केन उदाहरण:

def this_silly_method_too(num) 
    yield(num + 5) 
end 

this_silly_method_too(3) do |wtf| 
    puts wtf + 1 
end 

आउटपुट "9" है।

+0

'wtf'' कहां जाता है जब 'wtf |' ब्लॉक समाप्त होता है? – ThorSummoner

+0

यह ब्लॉक के लिए scoped है, तो यह इसके बाहर अनुपलब्ध है। दूसरे शब्दों में: यह दूर चला जाता है। –

+0

यदि यह परिवर्तनीय है? यह होना चाहिए, अन्यथा मुझे कोई संकेत नहीं है कि कैसे Vagrantfile उन्हें कॉन्फ़िगरेशन विधि के रूप में उपयोग कर सकता है। – ThorSummoner

5

do से end पर कोड Ruby block परिभाषित करता है। शब्द format ब्लॉक के लिए एक पैरामीटर है। ब्लॉक विधि कॉल के साथ पास किया जाता है, और कॉल की गई विधि ब्लॉक में yield मान हो सकती है।

रूबी के विवरण के लिए कोई भी पाठ देखें, यह रूबी की मुख्य विशेषता है जिसे आप हर समय देखेंगे।

+1

नहीं, क्या करें और अंत के बीच का कोड एक रूबी ब्लॉक है। लंबवत सलाखों के बीच की शर्तें उस ब्लॉक के पैरामीटर हैं। – rampion

+0

आईआईआरसी, पाइप सिंटैक्स को स्मॉलटाक से उधार लिया जाता है। –

+0

हाँ, स्मॉलटॉक को छोड़कर बस एक पाइप का उपयोग किया जाता है। – Chuck

3

जावा में बराबर | प्रतीकों के बीच एक ब्लॉक बैठ के लिए की तरह

// Prior definitions 

interface RespondToHandler 
{ 
    public void doFormatting(FormatThingummy format); 
} 

void respondTo(RespondToHandler) 
{ 
    // ... 
} 

// Equivalent of your quoted code 

respondTo(new RespondToHandler(){ 
    public void doFormatting(FormatThingummy format) 
    { 
     format.html(); 
     format.xml(); 
    } 
}); 
+0

ब्रेंट, यदि आप इसका मतलब रखते हैं, तो जावा संस्करण वर्बोज़ और वर्डी है - हाँ, मैं आपसे सहमत हूं। लेकिन फिर, यह जावा में एक कम बेवकूफ निर्माण है। रुबी हर समय इसका उपयोग करता है, जावा कम इतना है। –

+0

format.html(); format.xml(); भाग शायद एक स्विच स्टेटमेंट की तरह होगा, क्योंकि आप अनुरोध किए गए प्रारूप पर स्विच कर रहे होंगे। – jonnii

+0

एक क्लीनर उदाहरण जावास्क्रिप्ट में समकक्ष निर्माण है: answer_to (नया फ़ंक्शन (प्रारूप) {format.html(); format.xml();}); मुझे लगता है कि जावा की वास्तविक मज़ेदार समर्थन की कमी वास्तव में परेशान है; उन्हें बिल्कुल उपयोग करना मुश्किल नहीं है - जब तक कि आप उन्हें जावा में अज्ञात कक्षाओं के साथ नहीं सीखा! –

5
@names.each do |name| 
    puts "Hello #{name}!" 
end 
http://www.ruby-lang.org/en/documentation/quickstart/4/ पर

इस व्याख्या के साथ है:

each एक विधि है कि स्वीकार कोड का एक खंड तो किसी सूची में प्रत्येक तत्व के लिए कोड की है कि ब्लॉक चलाता है, और do और के बीच सा है end सिर्फ इतना ब्लॉक है। एक ब्लॉक एक अज्ञात फ़ंक्शन या lambda जैसा है। पाइप वर्णों के बीच चर इस ब्लॉक के लिए पैरामीटर है।

यहां क्या होता है कि सूची में प्रत्येक प्रविष्टि के लिए, name उस सूची तत्व से जुड़ा हुआ है, और उसके बाद अभिव्यक्ति puts "Hello #{name}!" उस नाम से चलती है।

24

यह मेरे लिए भी बहुत अजीब था, लेकिन मुझे आशा है कि यह स्पष्टीकरण/walkthru आपकी मदद करेगा।

प्रलेखन touches the subject, काफी अच्छे तरीके से - यदि मेरा उत्तर मदद नहीं करता है तो मुझे यकीन है कि उनकी मार्गदर्शिका होगी।

सबसे पहले, अपने खोल में irb टाइप करके इंटरैक्टिव रूबी दुभाषिया को आग लगाना और दर्ज करें।

प्रकार कुछ की तरह:

the_numbers = ['ett','tva','tre','fyra','fem'] # congratulations! You now know how to count to five in Swedish. 

सिर्फ इसलिए है कि हम एक सरणी के साथ खेलने के लिए है।फिर हम लूप बनाते हैं:

the_numbers.each do |linustorvalds| 
    puts linustorvalds 
end 

यह न्यूलाइन द्वारा अलग किए गए सभी नंबरों को आउटपुट करेगा।

for (i = 0; i < the_numbers.length; i++) { 
    linustorvalds = the_numbers[i] 
    print linustorvalds; 
} 

महत्वपूर्ण बातों का ध्यान रखना आवश्यक |thing_inside_the_pipes| कुछ भी हो सकता है कि, जब तक आप यह लगातार प्रयोग कर रहे हैं:

अन्य भाषाओं में आप की तरह कुछ लिखने के लिए होगा। और समझें कि यह लूप है जिसके बारे में हम बात कर रहे हैं, वह एक चीज थी जिसे मैं बाद में नहीं मिला था।

+2

कुछ "अन्य भाषाओं" (पायथन) में, आप 'linustorvalds प्रिंट करें linnorvalds' में linustorvalds के लिए लिखते हैं। थोड़ा और सहज, शायद। –

+1

बिल्कुल सही। मैंने सी-स्टाइल सिंटैक्स का चयन किया क्योंकि मुझे संदेह है कि रूबी आने वाले अधिक लोग इससे परिचित हैं, लेकिन मुझे उम्मीद है कि वे आपकी टिप्पणी भी पढ़ेंगे। –

+0

धन्यवाद। "अन्य भाषाओं" खंड ने मुझे यह समझने में मदद की कि क्या हो रहा था। +1। – rayryeng

1

यह और भी स्पष्ट बनाने के लिए, यदि आवश्यक हो तो:

पाइप सलाखों अनिवार्य रूप से पूर्व विधि कॉल से उत्पन्न मूल्य धारण करने के लिए एक नया वेरिएबल बनाते हैं। कुछ सदृश करने के लिए:

अपने विधि के मूल परिभाषा:

def example_method_a(argumentPassedIn) 
    yield(argumentPassedIn + 200) 
end 

यह कैसे किया जाता है:

newVariable = example_method_a(100) 
puts newVariable 
:

example_method_a(100) do |newVariable| 
    puts newVariable; 
end 

यह इस लेखन के रूप में लगभग एक ही है

wher ई, नया वैरिएबल = 200 + 100 = 300: डी!

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