我想要一个实例方法,用于创建一个带有参数名称及其值的哈希。
我精心设计了这个解决方案,但它很冗长。
class Foo
def bar(a, b, c, d)
params = self.method(:sum).parameters.map { |_, param| param }
params_with_values = {}
params.each do |param|
params_with_values[param] = binding.local_variable_get(param)
end
# continue work with params_with_values
...
end
end
如果我在第一行使用local_variables
(或者在定义任何其他局部变量之前),我可以像这样替换第一行:
class Foo
def bar(a, b, c, d)
params = local_variables
params_with_values = {}
params.each do |param|
params_with_values[param] = binding.local_variable_get(param)
end
# continue work with params_with_values
...
end
end
是否有更方便,更简洁或惯用的方式?
我设想解决的问题是我可以在方法内迭代生成的params
哈希(我不想在我的应用程序中返回params
哈希)。另外,我可以简单地将散列文字分配给局部变量params:
params = {a: a, b: b, c: c, d: d}
但是,我设想能够动态定义此方法,因此我无法在Foo#bar
内简单地键入哈希。
答案 0 :(得分:2)
没有一种惯用的方法可以做到这一点,因为方法中的局部变量在方法范围内是私有的 - 不仅在技术上,而且在惯例上。程序的其余部分不应该关注那些变量被调用的内容 - 暴露实现细节,就像非常 un 惯用。
那就是说,像往常一样,最不聪明的解决方案可能是最好的:
def bar(a, b, c, d)
{ a: a, b: b, c: c, d: d }
end
答案 1 :(得分:1)
使用local_variables
,您可以将代码重构为:
class Foo
def bar(a, b, c, d)
local_variables.to_enum.with_object({}) do |k, h|
h[k] = binding.local_variable_get(k)
end
end
end