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中是新的。这个的副本是的副本。这个的副本是的副本。