如何将Ruby顶级函数eval作为可调用对象传入map以简化代码?
如何简化
$*.map{eval _1}为方法引用形式 可行的简化写法
直接使用method(:eval)获取eval的方法引用,再通过&转换为Proc传递给map,最终精简代码:
$*.map(&method(:eval))
为什么你的尝试失败
$*.map(&eval):这里的eval会被立即执行(&会尝试把右侧表达式转为Proc,但裸写eval会直接调用它,无参时会读取标准输入),根本没传递方法引用,自然不符合预期。$*.map(:eval):map不接受单独的符号参数,&:xxx语法只适用于调用元素自身的实例方法,但String类并没有eval实例方法(eval是Kernel模块的顶级方法),所以这种写法完全不适用。
原理补充
Ruby里eval不是字符串的实例方法,而是Kernel提供的方法,所以没法用&:eval这种符号Proc的简写。method(:eval)会返回绑定当前上下文的Method对象,转成Proc后,会把map遍历的每个字符串作为参数传给eval,和原代码$*.map{eval _1}的逻辑完全一致,且更精简。
内容的提问来源于stack exchange,提问作者ShadowRanger
相关产品推荐
相关产品推荐

