有没有办法将单个参数传递给只有可选参数的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 :(得分: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形式出现。但是,将它们作为文档可以传递可以的选项。