如何创建或引用Ruby中用于eval的空Binding?
创建空Binding以满足Rubocop的Style/EvalWithLocation规则
Rubocop的Style/EvalWithLocation规则要求调用eval时必须传入binding、__FILE__和__LINE__参数,但如果你的lambda不需要访问当前作用域的任何变量,完全可以传入一个空Binding,避免引入不必要的上下文。
实现方式
要创建一个几乎不含任何自定义内容的空Binding,可以借助Ruby的BasicObject(最基础的类,仅保留核心方法)来生成:
# 生成空Binding empty_binding = BasicObject.new.instance_eval { binding } # 传入eval满足Rubocop规则 sort_lambda = eval "->(a) { a.date }", empty_binding, __FILE__, __LINE__
原理说明
BasicObject.new创建了一个不继承任何自定义模块/类的基础实例,其上下文里没有当前作用域的变量、方法或自定义self内容;- 通过
instance_eval { binding }在这个实例的上下文中生成Binding,确保该Binding的执行环境完全独立于当前代码的作用域; - 你的lambda仅依赖参数
a,因此在空Binding的环境中可以正常执行,同时完美符合Rubocop的规则要求。
内容的提问来源于stack exchange,提问作者Mike Slinn
相关产品推荐
相关产品推荐

