如何在我编写的JavaScript中重构Ruby的#{}方法

How to refactor Ruby's #{} method in JavaScript which I write

本文关键字:Ruby 重构 方法 JavaScript      更新时间:2023-09-26

当我编写Javascript代码时,我觉得很想念Ruby的#{}方法。所以我在JS中实现它。但是这段代码并不干净美观。我想让这种方法安全,但我做不到。
你知道这段代码是安全的还是美丽的吗?提前谢谢。

String.prototype.to_s = function(){
    var str = this.toString();

    // convert function is bad  because it use eval...
    var convert = function(s){
        return eval(s);
    };
    // It's slower because call ReGexp method too many times.
    while(/#{('w+)}/.test(str)){

        var matchStr =RegExp.$1;
        var str = str.replace(/#{('w+)}/,convert(matchStr));
    }
    return str;
};

var name = "nobi";
var age = 23;
var body = "I'm #{name} and I am #{age} years old".to_s();
// I'm nobi and I am 23 years old.

console.log(body);

这种黑客不能变得"美丽"——它甚至不适用于非全局变量。但是,鉴于ES6支持,您不需要黑客攻击;字符串插值现在是该语言的一部分。

var body = `I'm ${name} and I am ${age} years old`;

如果做不到这一点,字符串连接在 ES5 及更早版本中通常具有足够的可读性:

var body = "I'm " + name + " and I am " + age + " years old";

CoffeeScript,一种编译为JavaScript的语言,也支持此功能。

最接近你想要的是一个模板系统,比如小胡子。它允许您执行以下操作:

var person = {
  name: "nobi",
  age: 23
};
var output = Mustache.render("I'm {{name}} and I am {{age}} years old.", person);

或者使用咖啡脚本。

http://coffeescript.org/#strings

此外#{}不是 Ruby 中的方法,它被称为"字符串插值"。

http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#Interpolation