2011-01-20 87 views
18

我厌倦了写这个的:任何Ruby的#{}值(字符串插值)

string_needed = “前缀.....” +主题+ “后缀......” +名称+“测试”;

,我会觉得自己好像到现在已经做了一些关于这一点;)

+0

更好地做一个快捷方式,它的话,这句法,没有地方走了一会儿。 ;)你可以做的最好的事情就像是一个`sprintf`函数,但是这不会让事情变得更短。 – deceze 2011-01-20 03:24:07

+1

查看重复问题中评分最高的答案。 – Phrogz 2011-01-20 04:56:25

+1

ECMAscript 6有模板字符串...所以是的,将来您可以使用\字符串文本$ {表达式}字符串文本\`:https://developer.mozilla.org/en-US/docs/ Array.join的Web/JavaScript/Reference/template_strings – Ajedi32 2015-02-05 15:52:39

回答

18

对不起:(

我想借Array.join的优势:

["prefix ....", topic, "suffix....", name, "testing"].join("") 

或使用String.concat

String.concat("a", 2, "c") 

,你可以编写自己的连击功能:

var concat = function(/* args */) { 
    /* 
    * Something involving a loop through arguments 
    */ 
} 

,或者使用第三方sprintf功能,如http://www.diveintojavascript.com/projects/javascript-sprintf

10

你可以考虑使用coffeescript写的代码(其中有插值像Ruby即# {FOO})。

它编译“下调至JavaScript的 - 所以你最终会与像你写的JavaScript的,但没有必要写/维持+++代码你厌倦了

我知道那要求你考虑另一种语言是否是有效答案的边缘,但考虑到coffeescript的工作方式,并且你的一个标签是Ruby,我希望它能通过。

7

以JavaScript的好奇心,你可以实现的东西,基本上没有红宝石般的插值:

sub = function(str) { 
    return str.replace(/#\{(.*?)\}/g, 
    function(whole, expr) { 
     return eval(expr) 
    }) 
} 

js> y = "world!" 
world! 
js> sub("Hello #{y}") 
Hello world! 
js> sub("1 + 1 = #{1 + 1}") 
1 + 1 = 2 

上的任何东西,但字符串文字使用它是自找麻烦,而且它可能很慢,反正(虽然我没有测量过)。只是想我会让你知道的。

1

直接回答:没有javascript不支持字符串插值。

唯一的方法是自己实现它或使用第三方库为你做。

编辑

马科斯在评论中添加了孤单的ECMAScript 6(和谐)的建议,所以我们可以有适当的字符串插值:

var a = 5; 
var b = 10; 
console.log(`Fifteen is ${a + b} and\nnot ${2 * a + b}.`); 
// "Fifteen is 15 and 
// not 20." 

请查看更多信息here

0

我刚刚写了这个hacky函数来做到这一点。用法如下:

interpolate("#{gimme}, #{shelter}", {gimme:'hello', shelter:'world'}) 
// returns "hello, world" 

和实现:

interpolate = function(formatString, data) { 
    var i, len, 
     formatChar, 
     prevFormatChar, 
     prevPrevFormatChar; 
    var prop, startIndex = -1, endIndex = -1, 
     finalString = ''; 
    for (i = 0, len = formatString.length; i<len; ++i) { 
     formatChar = formatString[i]; 
     prevFormatChar = i===0 ? '\0' : formatString[i-1], 
     prevPrevFormatChar = i<2 ? '\0' : formatString[i-2]; 

     if (formatChar === '{' && prevFormatChar === '#' && prevPrevFormatChar !== '\\') { 
      startIndex = i; 
     } else if (formatChar === '}' && prevFormatChar !== '\\' && startIndex !== -1) { 
      endIndex = i; 
      finalString += data[formatString.substring(startIndex+1, endIndex)]; 
      startIndex = -1; 
      endIndex = -1; 
     } else if (startIndex === -1 && startIndex === -1){ 
      if ((formatChar !== '\\' && formatChar !== '#') || ((formatChar === '\\' || formatChar === '#') && prevFormatChar === '\\')) { 
       finalString += formatChar; 
      } 
     } 
    } 
    return finalString; 
};