String的方法参数

时间:2011-10-06 17:45:02

标签: ruby ruby-on-rails-3.1

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不应该有所有参数吗?

请建议。

3 个答案:

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