2015-03-02 65 views
0

有沒有辦法將一個參數傳遞給只有可選參數的ruby函數?Ruby - 如何將一個參數傳遞給一長串參數的方法?

例如,我想在下面的方法中傳遞ignoreAlreadyCrawled = true,並使用默認參數值來處理其他所有事情。但是由於它是最後一個參數,所以我必須調用crawl(nil,nil,nil,false,nil,false,nil,false,[],true),這是冗長而醜陋的。

方法:

def crawl(url = nil, proxy = nil, userAgent = nil, post = false, postData = nil, image = false, imageFilename = nil, forceNoUserAgent = false, ignoreSubDomains = [], ignoreAlreadyCrawled = false) 
     #..logic here 
    end  
+0

您使用的是哪個版本的ruby?你可以看看[關鍵字參數](https://robots.thoughtbot.com/ruby-2-keyword-arguments)如果使用紅寶石2 – 2015-03-02 14:53:20

+0

Ruby 2.1.2是我的版本 – 2015-03-02 14:54:40

回答

8

這是可能的紅寶石> = 2.0與關鍵字參數。在這種情況下,你有如下修改方法簽名(基本不變=:):

def crawl(url: nil, proxy: nil, userAgent: nil, post: false, postData: nil, image: false, imageFilename: nil, forceNoUserAgent: false, ignoreSubDomains: [], ignoreAlreadyCrawled: false) 
    #..logic here 
end 

它將按預期工作:

crawl(ignoreAlreadyCrawled: true) 

請參閱文章爲更多的例子:https://robots.thoughtbot.com/ruby-2-keyword-arguments

+0

如果我修改方法簽名,我還可以稱它爲舊的方式IE。爬行(someargument)?或者我總是需要指定關鍵字? – 2015-03-02 15:08:55

+0

恐怕,如果您更改方法以使用關鍵字參數,則必須堅持使用它們。 – 2015-03-02 15:19:38

1

當您有兩個或三個以上的參數時,首選模式是使用哈希選項。

如下我將重新定義這個方法:這類似於帕維爾的,但更具有可讀性,我想:

def crawl(options={}) 
    defaults = { url: nil, 
       proxy: nil, 
       userAgent: nil, 
       post: false, 
       postData: nil, 
       image: false, 
       imageFilename: nil, 
       forceNoUserAgent: false, 
       ignoreSubDomains: [], 
       ignoreAlreadyCrawled: false 
      } 
    options = defaults.merge(options) 
    #..logic here 

end 

你可以從默認省略具有nil作爲其默認的所有選項,作爲一個未定義的選項會無論如何都是零。但是,讓他們在那裏可以作爲可以通過的文檔。

+0

我不認爲這是在2.0之前的Ruby版本中的首選方法。否則,我更喜歡使用像Pawel這樣的關鍵字參數。 – ptd 2015-03-02 16:20:52