2015-03-02 68 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