tl? dr: क्या पुन: प्रयोज्य टेम्पलेट को शाब्दिक बनाना संभव है?
मैं टेम्पलेट शाब्दिक का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे लगता है कि मुझे अभी नहीं मिला है और अब मैं निराश हो रहा हूं। मेरा मतलब है, मुझे लगता है कि मैं इसे प्राप्त करता हूं, लेकिन "यह" यह नहीं होना चाहिए कि यह कैसे काम करता है, या इसे कैसे प्राप्त करना चाहिए। इसे अलग तरह से मिलना चाहिए।
मेरे द्वारा देखे गए सभी उदाहरणों (यहां तक कि टेम्प्लेट किए गए टेम्प्लेट) के लिए यह आवश्यक है कि "प्रतिस्थापन" को घोषणा के समय किया जाए और समय न चलाया जाए, जो टेम्प्लेट के लिए मेरे लिए बिल्कुल बेकार लगता है। शायद मैं पागल हूं, लेकिन मेरे लिए एक "टेम्पलेट" एक दस्तावेज है जिसमें टोकन शामिल हैं जो इसका उपयोग करने पर प्रतिस्थापित हो जाते हैं, न कि जब आप इसे बनाते हैं, अन्यथा यह सिर्फ एक दस्तावेज (यानी, एक स्ट्रिंग) है। एक टोकन को टोकन के रूप में टोकन के साथ संग्रहीत किया जाता है और जब आप मूल्यांकन करते हैं तो उन टोकन का मूल्यांकन किया जाता है।
हर कोई समान उदाहरण देता है:
var a = 'asd';
return `Worthless ${a}!`
यह अच्छा है, लेकिन अगर मुझे पहले से पता है a
, तो मैं सिर्फ return 'Worthless asd'
या return 'Worthless '+a
। क्या बात है? गंभीरता से। ठीक है बिंदु आलस्य है; कम प्लस, अधिक पठनीयता। महान। लेकिन यह एक टेम्पलेट नहीं है! IMHO नहीं। और MHO सब मायने रखता है! समस्या, IMHO, यह है कि टेम्पलेट का मूल्यांकन तब किया जाता है जब वह घोषित की जाती है, इसलिए, यदि आप करते हैं, तो IMHO:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
चूंकि expletive
घोषित नहीं किया गया है, यह कुछ इस तरह का उत्पादन करता है My undefined template
। उत्तम। असल में, क्रोम में कम से कम, मैं टेम्पलेट भी घोषित नहीं कर सकता; यह एक त्रुटि फेंकता है क्योंकि expletive
परिभाषित नहीं है। टेम्प्लेट घोषित करने के बाद मुझे प्रतिस्थापन करने में सक्षम होने के लिए क्या चाहिए:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
हालाँकि, मैं नहीं देखता कि यह कैसे संभव है, क्योंकि ये वास्तव में टेम्पलेट नहीं हैं। यहां तक कि जब आप कहते हैं कि मुझे टैग का उपयोग करना चाहिए, नहीं, वे काम नहीं करते हैं:
> explete = function(a,b) { console.log(a); console.log(b); }
< function (a,b) { console.log(a); console.log(b); }
> var tpl = explete`My ${expletive} template`
< VM2323:2 Uncaught ReferenceError: expletive is not defined...
यह सब मुझे विश्वास दिलाता है कि टेम्पलेट शाब्दिक रूप से गलत तरीके से लिखे गए हैं और उन्हें बुलाया जाना चाहिए कि वे वास्तव में क्या हैं: heredocs । मुझे लगता है कि "शाब्दिक" भाग को मुझे छोड़ देना चाहिए था (जैसा कि अपरिवर्तनीय है)?
क्या मैं कुछ भूल रहा हूँ? क्या पुन: प्रयोज्य टेम्पलेट को शाब्दिक बनाने का एक (अच्छा) तरीका है?
मैं तुम्हें देता हूं, पुन: प्रयोज्य टेम्पलेट शाब्दिक :
> function out(t) { console.log(eval(t)); }
var template = `\`This is
my \${expletive} reusable
template!\``;
out(template);
var expletive = 'curious';
out(template);
var expletive = 'AMAZING';
out(template);
< This is
my undefined reusable
template!
This is
my curious reusable
template!
This is
my AMAZING reusable
template!
और यहाँ एक भोले "सहायक" समारोह है ...
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
... इसे "बेहतर" बनाने के लिए।
मैं उन्हें उस क्षेत्र की वजह से टेम्पलेट जाइटर कहलाने के लिए इच्छुक हूं, जहां से वे गंदी भावनाओं का उत्पादन करते हैं।
<strike>
टैग में रखें ।