2009-01-07 16 views
9

मैं सरल उदाहरण निकाले:रूबी ब्लॉक और unparenthesized तर्क

require 'pp' 
x = 1..3 
pp x.map do |i| {:value => i, :double => (i*2)} end 
pp x.map { |i| {:value => i, :double => (i*2)} } 

pp(x.map do |i| {:value => i, :double => (i*2)} end) 
pp(x.map { |i| {:value => i, :double => (i*2)} }) 

मैं सोच रहा हूँ क्यों पहले पीपी का उत्पादन:

[1, 2, 3] 

जबकि सभी oders दे रहे हैं:

[{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}] 

मैं मान लें कि ऑपरेटर की प्राथमिकता के साथ इसका कुछ संबंध है। मुझे अच्छी व्याख्या कहां मिल सकती है?

+2

यह [रूबी ब्लॉक सिंटेक्स त्रुटि] (http://StackOverflow.Com/q/6854283/) का डुप्लिकेट है, [कोड ब्लॉक प्रत्येक 'प्रत्येक' कार्यों को ब्रैकेट के साथ पास करता है लेकिन 'do'-'end' (ruby)] के साथ नहीं (http://StackOverflow.Com/q/6718340/), [ब्लॉक परिभाषा - ब्रेसिज़ और' do'-'end' के बीच अंतर?] (http://StackOverflow.Com/q/6179442/), [रूबी मल्टीलाइन ब्लॉक 'do'' end' के बिना] (http://StackOverflow.Com/q/3680097/), ['do' ब्लॉक बनाम ब्रैकेट' {} ' ] (http://StackOverflow.Com/q/2122380/) और [रुबी में इन ब्लॉक कोडिंग शैलियों का अंतर या मूल्य क्या है?] (http://StackOverflow.Com/q/533008/)। –

+0

इस पोस्ट तिथि में रूबी-2.2.0 का उपयोग करके एक प्राइ सत्र का भाग। pp_hash = x.map do | i | {: value => i,: double => (i * 2)} => [{: value => 1,: double => 2}, {: value => 2,: double => 4} , {: value => 3,: double => 6}] pp_hash.join (",") "{: value => 1,: double => 2}, {: value => 2,: डबल => 4}, {: मूल्य => 3,: डबल => 6} " जो जेसन के आज के उपयोग में शायद अधिक वांछनीय है लेकिन यह केवल आउटपुट पढ़ने के लिए शैली का मामला है। कभी-कभी इससे कोई फर्क नहीं पड़ता कि आप किस कोड को पास करने जा रहे हैं जब तक आपका कोड सही प्रकार को संभाल सके। pp_hash = pp_hash.join (",") –

+0

यह एक टैंगेंट पर जाने से पहले मुझे वास्तव में मिला। यह प्राइ में पहला हिस्सा है .... [53] pry (मुख्य)> पीपी x.map do | i | {: key => i,: value => (i * 2)} अंत # <गणनाकर्ता: ...> => # <गणक: ...> –

उत्तर

14

यह है क्योंकि आप

pp x.map 

कॉल कर रहे हैं और पीपी के लिए एक ब्लॉक (यह ध्यान नहीं देता है)

रूप Programming Ruby पुस्तक

ब्रेसिज़ एक उच्च पूर्वता है में विस्तार से बताया गुजर है; क्या कम प्राथमिकता

तो, प्रभावी रूप से, ब्रेसिज़ उनके निकटतम फ़ंक्शन कॉल (x.map) से जुड़ते हैं जबकि सबसे दूर दूर (पीपी) से बांधते हैं। यह थोड़ा सा सरल है लेकिन इसे इस स्थिति को समझा जाना चाहिए

+0

धन्यवाद @ गैरेथ, क्या आप किसी भी औपचारिक संदर्भ के बारे में जानते हैं ? कुछ भाषा विनिर्देश, आदि? – rkj

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