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,这一阵后再说
撒发坐着呀…
快上 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
解释
-
interpolate 函数:
- 接收两个参数:
str
是包含占位符的原始字符串,context
是包含所有变量上下文的对象。 - 使用正则表达式
\#\{([^\}]+)\}
匹配字符串中的占位符(如#{name}
或#{age}
)。 - 对每个匹配到的占位符调用
eval
函数计算其值。
- 接收两个参数:
-
调用示例:
- 创建了两个变量
name
和age
。 - 调用
interpolate
函数并传入包含占位符的字符串以及变量上下文对象{ name, age }
。 - 打印结果,可以看到字符串被正确地替换成变量的实际值。
- 创建了两个变量
这种方法虽然能实现字符串内插的功能,但请注意 eval
可能带来的安全风险,特别是在处理用户输入时。因此,在实际项目中应该谨慎使用。