2011-10-06 33 views
0

1)我有一个方法方法参数为String

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'为#。不应该有所有参数?

请指教。

回答

1

args只会包含参数,如果您的方法定义类似于def self.createobj(*args)。没有这个args没有定义。

您需要手动将所有参数传递给get_params_str。除非将get_params_str的方法签名更改为def self.get_params_str(*a)(将所有传递给get_params_str的参数放入单个数组中),否则您需要将其作为数组传递给它们,例如get_params_str([api_key, amnt, commentstr, ...])

2

你试图做的事情(试图使用一个名为args的魔术变量来保存所有参数)在Ruby中不能以这种方式工作。

的方法可以有可选ARGS:

def my_method(*args) 
    .... 
    # the array args will have 0 or more elements, depending on how many 
    # were in the method invocation. 
end 

但是,如果一个方法都有特定的(要求)指定参数时,在你的榜样,那么有没有其他办法让他们。

新增如果你愿意改变你的方法的定义中使用的变通为命名参数,那么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

正如其他响应所述,没有可用的变量,如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 
+0

+1所以'参数'是反映的命名参数?聪明。 –

+0

我不知道'参数'的程度,但是例如,如果你在'def test(a,* b,&blk) ; end')上尝试它,你将会得到'[[:req,:a],[:rest,: b],[:block,:blk]]'这样不仅它给你一个符号的名字,而且还告诉你它是否是必需的,块等等。 – derp

相关问题