ruby 获取用于传递参数的变量的名称

zfciruhq  于 2023-05-17  发布在  Ruby
关注(0)|答案(1)|浏览(69)

有没有一种方法可以让一个方法知道调用者中作为参数传递给该方法的变量的名称?
真实的世界用例场景:我使用的是一个自己开发的工具,它只是将字符串输出到一个文件中。这不是什么花哨的东西,但它符合我的目的。例如,我可能想要输出一个简单的字符串:

MYTOOL.puts 'some useful information'

我经常想输出变量的名称和值。我发现自己经常这样做:

MYTOOL.puts 'variable: ' + variable

我希望能够做到这一点:

MYTOOL.showvar variable

回到我的Perl时代,我能够使用预处理器,这样我就可以做到这一点:

showvar $variable;

不过,我宁愿避免使用预处理器。有没有一种方法可以在Ruby中实现这种功能?
编辑:我使用了以下版本的Ruby:
ruby 2.7.0p0(2019-12-25 revision 647ee6f091)[x86_64-linux-gnu]

monwx1rj

monwx1rj1#

你可以使用短语法来传递Ruby 3.1中引入的关键字参数,例如。如下

variable = "hello world"
puts variable:
# => {:variable=>"hello world"}

这相当于调用

puts variable: variable

Ruby的这个特性是在#14579中引入的,并在Ruby 3.1中发布。
对于老Ruby,你必须更有创造力一点。一种可能性是利用binding_of_caller gem,它允许我们访问调用调试方法的代码的Binding。这允许我们访问在此上下文中设置的局部变量。

require 'binding_of_caller'

class MyTool
  def showvar(*variables)
    caller_binding = binding.of_caller(1)
    variables.each do |var|
      puts "#{var}: #{caller_binding.local_variable_get(var.to_sym).inspect}"
    end
  end
end

MYTOOL = MyTool.new

hello = "hello world"
MYTOOL.showvar(:hello)
# => hello: "hello world"

请注意,在Ruby中,展开堆栈以访问绑定的开销非常大。因此,如果你经常使用它,你的代码可能会变得相当慢。不过,对于一些有限的调试来说,它可能没问题。

相关问题