Ruby中方法参数的思考

Ruby中方法参数的思考,ruby,reflection,Ruby,Reflection,参加以下课程: class Automator def fill_specific_form(fields) fields.each_pair do |key, value| puts "Setting '#{key}' to '#{value}'" end end end a = Automator.new a.fill_specific_form :first_name => "Mads", :last_name => "Mobæk" #

参加以下课程:

class Automator
  def fill_specific_form(fields)
    fields.each_pair do |key, value|
      puts "Setting '#{key}' to '#{value}'"
    end
  end
end

a = Automator.new
a.fill_specific_form :first_name => "Mads", :last_name => "Mobæk"

# => Setting 'first_name' to 'Mads'
# => Setting 'last_name' to 'Mobæk'
不使用散列也可以这样做吗?由于所有参数都是必需的,因此我需要一个具有以下签名的方法:

fill_specific_form(first_name, last_name)
在我看来,通过让方法体反映并迭代其参数,从而获得相同的结果,这是可能的

您将如何实现这一点?这种模式/习惯用法是否已经存在?两个明显的好处是IDE中的参数信息和不必检查是否提供了所有哈希键

我想避免的是:

puts "Setting first_name to #{first_name}"
puts "Setting last_name to #{last_name}"
# and so on

我不太明白。是否要在单个阵列中接收所有参数

def fill_specific_form *args
    #Process args
end

我不太明白。是否要在单个阵列中接收所有参数

def fill_specific_form *args
    #Process args
end

如果在方法中未设置其他局部变量,
local\u variables
将为您提供方法参数名称的列表(如果设置了其他变量,您可以首先调用
local\u variables
并记住结果)。因此,您可以使用
local\u变量
+
eval

class Automator
  def fill_specific_form(first_name, last_name)
    local_variables.each do |var|
      puts "Setting #{var} to #{eval var.to_s}"
    end
  end
end

Automator.new().fill_specific_form("Mads", "Mobaek")
然而,请注意,这是纯粹的邪恶

至少以你为例

puts "Setting first_name to #{first_name}"
puts "Setting last_name to #{last_name}"
看起来更明智


您也可以在方法的开头执行
字段={:first\u name=>first\u name,:last\u name=>last\u name}
,然后使用
字段。每对
代码。

如果您在方法中没有设置其他局部变量,
局部\u变量
将为您提供方法参数名称的列表(如果您设置了其他变量,您可以首先调用
local\u variables
并记住结果)。因此,您可以使用
local\u variables
+
eval
执行您想要的操作:

class Automator
  def fill_specific_form(first_name, last_name)
    local_variables.each do |var|
      puts "Setting #{var} to #{eval var.to_s}"
    end
  end
end

Automator.new().fill_specific_form("Mads", "Mobaek")
然而,请注意,这是纯粹的邪恶

至少以你为例

puts "Setting first_name to #{first_name}"
puts "Setting last_name to #{last_name}"
看起来更明智


您还可以在方法的开头执行
字段={:first\u name=>first\u name,:last\u name=>last\u name}
,然后使用
字段。每对
代码。

反映方法的(或
Proc
)参数,您可以使用
Proc#parameters
Method#parameters
UnboundMethod#parameters

->(m1, o1=nil, *s, m2, &b){}.parameters
# => [[:req, :m1], [:opt, :o1], [:rest, :s], [:req, :m2], [:block, :b]]
但是,在您的情况下,我不明白为什么需要反射,因为您已经知道了参数的名称。

要对方法(或
Proc
)参数进行反射,可以使用
Proc#参数
method#参数
UnboundMethod#参数

->(m1, o1=nil, *s, m2, &b){}.parameters
# => [[:req, :m1], [:opt, :o1], [:rest, :s], [:req, :m2], [:block, :b]]

但是,在您的情况下,我不明白为什么需要反射,因为您已经知道了参数的名称。

不太清楚。这只会获得传递的值。通过使用与表单元素名称匹配的显式参数名称,我可以设置name=value。请参阅sepp2k的回答不太清楚。这只会获得传递的值。通过使用explicit参数名称与表单元素的名称匹配,然后我可以设置name=value。请参阅sepp2k的回答Pure evil不是故意的,也不是我想要的。只是想知道是否有办法做到这一点。我将测试您的建议,然后返回youfields={:first_name=>first_name,:last_name=>last_name}这就是我想要的。谢谢。我试过Ruby 1.9.3,你必须做{eval var.to_s}若要使其工作,否则会出现一个TypeError:无法将符号转换为String@JavidJamae是的,他们在1.9中已将局部变量从字符串数组更改为符号数组。纯邪恶不是故意的,也不是我想要的。只是好奇是否有办法做到这一点。我将测试您的建议,然后返回youfields={:first_name=>first_name,:last_name=>last_name}是我想要的。谢谢。我试过Ruby 1.9.3,你必须做{eval var.to_s}若要使其工作,否则会出现一个TypeError:无法将符号转换为String@JavidJamae是的,他们在1.9中已经将局部变量从字符串数组更改为符号数组。这在1.9.2中是新的吗?这在1.8.7或1.9.1中对我不起作用。@sepp2k:是的,
Proc#parameters
在1.9.2中是新的。这在1.9.2中是新的吗?这不起作用k代表我在1.8.7或1.9.1中。@sepp2k:是的,
Proc#参数
在1.9.2中是新的。这个的副本是的副本。这个的副本是的副本。