1)我有一个方法
def self.createobj(api_key, amnt, commentstr, orderid, order_creation_date, orderfullfilmentdate)
.....
end
2)我想创建一个传递给该函数的所有参数的error_str ...
2.1)像
这样的东西errorstr = "api_key: " + api_key.to_s + " amnt: " + amnt.to_s + " commentstr: " + commentstr.to_s + " orderid: " + orderid.to_s + " order_creation_date: " + order_creation_date.to_s + " orderfullfilmentdate: " + orderfullfilmentdate.to_s
2.2)所以我创建了另一种方法
def self.get_params_str(a)
str = ""
a.each do |a|
str = str + a.to_s
end
return str
end
2.3)所以我从createobj调用这个新方法。像
这样的东西def self.createobj(api_key, amnt, commentstr, orderid, order_creation_date, orderfullfilmentdate)
errorstr = get_params_str(args)
.....
end
3)但是我得到错误未定义的局部变量或方法`args'用于#。 args不应该有所有参数吗?
请建议。
答案 0 :(得分:2)
你正在尝试做什么(尝试使用一个名为args的魔术变量来保存所有参数)在Ruby中不会以这种方式工作。
方法可以有可选的参数:
def my_method(*args)
....
# the array args will have 0 or more elements, depending on how many
# were in the method invocation.
end
但是如果一个方法具有特定的(必需的)args,就像在你的例子中一样,那么没有其他方法可以实现它们。
已添加如果您愿意更改方法的定义以使用针对命名参数的变通方法,则args将作为关联数组到达,然后您可以将它们发送给您get_params_string
或者更好,重新定义您的get_params_string
以获取变量arg列表
def self.get_params_str(*a)
str = ""
a.each do |a|
str = str + a.to_s
end
return str
end
# Then call it from your main method:
def self.createobj(api_key, amnt, commentstr, orderid,
order_creation_date, orderfullfilmentdate)
errorstr = get_params_str(api_key, amnt, commentstr, orderid,
order_creation_date, orderfullfilmentdate)
.....
end
查看有用的post
答案 1 :(得分:1)
args
, def self.createobj(*args)
将只包含参数。没有args
没有定义。
您需要手动将所有参数传递给get_params_str
。您需要将它们作为数组传递,即get_params_str([api_key, amnt, commentstr, ...])
,除非您将get_params_str
的方法签名更改为def self.get_params_str(*a)
(将所有传递给get_params_str
的参数放入单个数组`)。
答案 2 :(得分:1)
正如其他回复中所述,没有可用的变量如args
提供方法的参数名称,但是如果你使用的是Ruby 1.9.2(我无法确认是否存在于1.9 .1)你有方法parameters
所以你可以做这样的事情:
def foo(a, b, c)
errorstr = method(:foo).parameters.map{|p| "#{p.last}: #{eval p.last.to_s}" }.join(', ')
puts errorstr
end
foo(1, 2, 3) #=> a: 1, b: 2, c: 3