Ruby中是否有类似于Python的vars()方法的模拟方法?

3

Python中有vars()方法,它返回一个将局部变量名作为键、对应值作为值的字典,因此可以像这样做:

a = 1
b = 2
"%(a)s %(b)s" % vars()

在Ruby中有一个vars()函数的类比吗?我所能想到的最接近的结构是:
local_variables.inject({}) {|res,var| res[var] = eval(var.to_s); res}

1
类似于您提出的内容:https://dev59.com/JnRC5IYBdhLWcg3wCMnX#430861 - Mark
你可能想使用 #inspect。 - rogerdpack
这不是 vars() 的正确使用方式。事实上,那样做相当糟糕。 - Devin Jeanpierre
Devin,你能解释一下你的话吗?vars()应该用于什么?这个例子有什么缺点? - dimus
2个回答

1

你所做的事情的 Ruby 等效方法只是:

"#{a} #{b}"

你需要 vars() 的另一个原因吗?


1
你可以像这样实现它,但这不是很好看。正如gnibbler指出的那样,使用插值更容易。我认为这样做的唯一优点是,如果格式字符串多次格式化相同的值。即使是这样,使用自定义哈希(而不是将变量转储到格式化程序中)或将其抽象成一个方法可能也更容易。
#!/usr/bin/env ruby

module Kernel
  def vars(b)
    Hash[
      (b.eval('local_variables')-[:_]).
      map{|v| [v,b.eval(v.to_s)]}
    ]
  end
end

a = 10
puts vars(binding)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接