2011-10-06 69 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

相關問題