Ruby无需预处理器,方法如何获取传入参数的变量名?
在Ruby 2.7中实现
MYTOOL.showvar功能的方案 完全可以实现,不用预处理器也能搞定,Ruby有现成的语言特性可以利用:
方案一:通过绑定与调用栈获取变量名
借助Ruby的binding机制和调用栈,能反向解析出传入变量的名称,代码示例如下:
class MYTOOL def self.showvar(var) # 获取调用方的上下文绑定 caller_binding = caller_locations(1, 1)[0].binding # 在调用方的局部变量中找到值匹配的变量名 var_name = caller_binding.local_variables.find do |name| caller_binding.local_variable_get(name) == var end # 替换成你的MYTOOL.puts即可实现文件输出 puts "#{var_name}: #{var}" end end # 测试示例 test_var = "Hello Ruby 2.7" MYTOOL.showvar test_var # 输出: test_var: Hello Ruby 2.7
⚠️ 小局限:如果存在多个值相同的变量,会返回第一个匹配的变量名,多数场景下不影响使用。
方案二:用代码块捕获变量名(Ruby 2.7+适配)
Ruby 2.7对代码块的源码解析支持更友好,用块语法能精准捕获变量名,避免值重复的问题:
class MYTOOL def self.showvar(&block) # 从块的源码中提取变量名 var_name = block.source.match(/^\s*(.+)\s*$/)[1] # 执行块获取变量值 var_value = block.call # 替换成你的MYTOOL.puts实现文件输出 puts "#{var_name}: #{var_value}" end end # 测试示例 count = 100 MYTOOL.showvar { count } # 输出: count: 100
这种方式调用时需要写块,但胜在准确性更高,不会出现变量名匹配错误的情况。
内容的提问来源于stack exchange,提问作者tscheingeld
相关产品推荐
相关产品推荐

