Ruby反射:如何在each块中获取数组元素的原始定义?
Ruby中each块无法直接获取数组元素的原始表达式
不行,Ruby在执行数组初始化阶段就会先计算所有元素的表达式,把求值结果存入数组,原始的表达式定义在运行时已经完全丢失了,each块只能拿到计算后的最终值。
具体原因:
- 对于
[Integer.class, String.class, Module.class],Ruby会先执行每个元素的class调用,得到Class对象后再存入数组,数组里存储的都是Class实例,没有任何关于Integer.class这个调用语句的信息。 - 对于
[1+1,2+2],Ruby会先完成算术运算,把2和4放进数组,原始的1+1、2+2表达式不会被保留在数组中。
可行的替代方案(基于字符串保存表达式)
如果需要同时获取表达式和结果,只能手动将表达式以字符串形式存储,再通过eval执行,示例:
["1+1", "2+2", "Integer.class"].each do |expr| puts "#{expr} → #{eval(expr)}" end
输出:
1+1 → 2 2+2 → 4 Integer.class → Class
进阶思路(借助AST解析)
如果不想用字符串存储,只能通过解析Ruby代码的抽象语法树(AST)来获取原始表达式,比如使用parser gem。但这需要在代码运行前解析源码文本,并非从运行时的数组元素中直接提取原始定义,本质还是依赖对原始代码的访问。
内容的提问来源于stack exchange,提问作者Jonny Hotchkiss
相关产品推荐
相关产品推荐

