Nodejs 使用eval实现类似ruby的string内插

Nodejs 使用eval实现类似ruby的string内插

RT…

https://github.com/magicdawn/eval-string-interpolation https://www.npmjs.org/package/eval-string-interpolation

var inter = require('eval-string-interpolation');

var name = “zhangsan” var age = 18

console.log(eval(inter(“name = #{name} , age = #{age}”))); // name = zhangsan , age = 18

可以把 inter移到后面,少一层括号,通过 String.prototype.__defineProperty 实现

做这个玩意,主要是模版引擎太重量级了,util.format不好用. 然后想实现 那种 somefunc(xxx)的,发现除了eval,其他的不能访问当前作用域. 挣扎中修改了Module._contextLoad = true,和 Module._compile 中的 runInNewContext -> runInContext , 这种只能是模块的 局部变量有效,碰到函数之类不行,只能用eval了…

目前不支持 @ -> this,这一阵后再说


4 回复

Node.js 使用 eval 实现类似 Ruby 的字符串内插

在某些场景下,我们可能希望在 Node.js 中实现类似于 Ruby 的字符串内插功能。Ruby 的字符串内插允许我们在字符串中直接嵌入变量或表达式,例如 "#{variable}""#{expression}"

在 Node.js 中,我们可以使用 eval 来实现类似的字符串内插功能。虽然 eval 通常被认为是危险的,但在受控环境中使用它来实现特定的功能还是可以接受的。

示例代码

首先,我们需要安装 eval-string-interpolation 包,它可以帮助我们更方便地进行字符串内插。

npm install eval-string-interpolation

接下来,我们可以在代码中使用这个包:

const inter = require('eval-string-interpolation');

const name = "zhangsan";
const age = 18;

// 使用 eval 和 eval-string-interpolation 进行字符串内插
console.log(eval(inter("name = #{name}, age = #{age}"))); // 输出: name = zhangsan, age = 18

详细解释

  1. 安装包:我们使用 npm install 安装 eval-string-interpolation 包。
  2. 引入包:使用 require 引入该包,并将其赋值给变量 inter
  3. 字符串内插:在 inter 函数中,我们传递一个包含 #{variable}#{expression} 的字符串。这些占位符会被替换为实际的变量值或表达式的计算结果。
  4. 使用 evaleval 函数会执行传入的字符串作为 JavaScript 代码,从而实现字符串内插的效果。

其他实现方式

我们还可以通过扩展 String.prototype 来简化语法,使其更接近于 Ruby 的风格。例如,定义一个新的方法来实现字符串内插:

String.prototype.interpolate = function (context) {
    return eval(this.replace(/#\{(\w+)\}/g, (match, p1) => {
        return context[p1];
    }));
};

const name = "zhangsan";
const age = 18;

console.log(`name = #{name}, age = #{age}`.interpolate({ name, age })); // 输出: name = zhangsan, age = 18

在这个例子中,我们定义了一个 interpolate 方法,它可以将字符串中的 #{variable} 替换为实际的变量值。

注意事项

  • 安全性:使用 eval 可能会导致安全问题,因此在生产环境中应谨慎使用。
  • 性能:频繁使用 eval 可能会影响性能,因此在性能敏感的应用中应避免使用。
  • 可维护性:复杂的字符串内插可能会降低代码的可读性和可维护性,因此应权衡利弊。

通过这种方式,我们可以在 Node.js 中实现类似于 Ruby 的字符串内插功能,提高代码的灵活性和可读性。


撒发坐着呀…

快上 Coffee 贼船

在 Node.js 中实现类似 Ruby 的字符串内插功能可以通过 eval 来实现。这里有一个简单的示例,展示如何使用 eval 和字符串替换来达到这一效果。

首先,我们需要创建一个函数来处理字符串中的占位符,并使用 eval 来计算这些占位符的值。

function interpolate(str, context) {
    return str.replace(/\#\{([^\}]+)\}/g, (match, key) => {
        // 使用 eval 计算表达式的值
        return eval(key);
    });
}

const name = "zhangsan";
const age = 18;

const interpolatedStr = interpolate("name = #{name}, age = #{age}", { name, age });

console.log(interpolatedStr); // 输出: name = zhangsan, age = 18

解释

  1. interpolate 函数:

    • 接收两个参数:str 是包含占位符的原始字符串,context 是包含所有变量上下文的对象。
    • 使用正则表达式 \#\{([^\}]+)\} 匹配字符串中的占位符(如 #{name}#{age})。
    • 对每个匹配到的占位符调用 eval 函数计算其值。
  2. 调用示例:

    • 创建了两个变量 nameage
    • 调用 interpolate 函数并传入包含占位符的字符串以及变量上下文对象 { name, age }
    • 打印结果,可以看到字符串被正确地替换成变量的实际值。

这种方法虽然能实现字符串内插的功能,但请注意 eval 可能带来的安全风险,特别是在处理用户输入时。因此,在实际项目中应该谨慎使用。

回到顶部