Ruby - 如何将单个参数传递给具有长参数列表的方法?

时间:2015-03-02 14:51:13

标签: ruby-on-rails 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      

2 个答案:

答案 0 :(得分:8)

对于带有关键字参数的ruby> = 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

答案 1 :(得分:1)

当您有两个或三个以上的参数时,首选模式是使用Hash of options。

我会将此方法重新定义如下:这与Pawel相似,但更具可读性,我认为:

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作为默认选项的选项,因为未定义的选项无论如何都会以nil形式出现。但是,将它们作为文档可以传递可以的选项。