获取参数的名称和值

时间:2015-11-23 06:58:20

标签: ruby

我想要一个实例方法,用于创建一个带有参数名称及其值的哈希。

我精心设计了这个解决方案,但它很冗长。

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内简单地键入哈希。

2 个答案:

答案 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