2013-06-18 6 views
9

मुझे समझ नहीं आता, साथ eval क्यों इस तरह eval काम करता है:रूबी: स्ट्रिंग प्रक्षेप

"123 #{456.to_s} 789" # => "123 456 789" 
eval('123 #{456.to_s} 789') # => 123 

मैं eval अंदर एक स्ट्रिंग में कैसे को जोड़ सकते हैं?

अद्यतन:

धन्यवाद, मित्र। इसने काम कर दिया।

तो अगर आप #{} जिसे आप बाद में eval करना चाहते हैं के साथ एक स्ट्रिंग चर है, तो आप यह करना चाहिए के रूप में नीचे की व्याख्या:

string = '123 #{456} 789' 
eval("\"" + string + "\"") 
# => 123 456 789 

या

string = '123 #{456} 789' 
eval('"' + string + '"') 
# => 123 456 789 
+1

"मैक्रो प्रतिस्थापन" से आपका क्या मतलब है? – sawa

+0

@sawa, मेरा मतलब था '# {}' अनुभाग, कृपया इसे सही तरीके से संपादित करें, मुझे नहीं पता कि यह अंग्रेजी पर कैसे कहें –

+1

ठीक है, शायद आप इंटरपोलेशन का मतलब है। – sawa

उत्तर

19

क्या हो रहा है, eval स्रोत कोड के रूप में स्ट्रिंग का मूल्यांकन कर रहा है। आप दोहरे उद्धरण चिह्नों का उपयोग करते हैं, स्ट्रिंग

eval '"123 #{456.to_s} 789"' 
# => "123 456 789" 

अंतर्वेशित है लेकिन जब आप एकल उद्धरण का उपयोग करें, कोई प्रक्षेप है, इसलिए # एक टिप्पणी शुरू होता है, और आप

123 #{456.to_s} 789 
# => 123 

स्ट्रिंग प्रक्षेप होता है मिल eval कॉल से पहले क्योंकि यह विधि के पैरामीटर है।

यह भी ध्यान दें कि 456.to_s अनावश्यक है, आप केवल #{456} कर सकते हैं।

+1

डबल कोट्स के साथ सिंगल कोट्स को प्रतिस्थापित करने से सिंटैक्स त्रुटि मिलती है क्योंकि 'eval (" 123 # {456.to_s} 789 ")' 123 456 789' – Stefan

+0

के रूप में मूल्यांकन किया गया है यदि स्ट्रिंग # {} है और इस तरह उद्धरण: स्ट्रिंग = '12 # {45} 78 "9" 0 ' –

3

आप चाहते थे:

eval('"123 #{456.to_s} 789"') 

। । । उम्मीद है कि आप देख सकते हैं क्यों?

कोड eval से interpretter के लिए पारित बिल्कुल के रूप में यदि आप इसे लिखा था (irb में, या एक .rb फ़ाइल के भाग के रूप में), तुम उत्पादन के लिए एक eval एक स्ट्रिंग मान चाहते हैं, स्ट्रिंग आप चाहिए का मूल्यांकन तो है उन उद्धरणों को शामिल करें जो अभिव्यक्ति को String में बनाते हैं।

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