Ruby:检查对象是否有特定签名的方法,如respond_to?



是否有一种方法可以检查Ruby中是否存在特定的方法签名?

例如,我想调用

thing.make(env: @@__ENV__, apiKey: "myKey")

如果我做这个检查

if thing.respond_to? 'make'
我可以以错误 结束
ArgumentError: unknown keyword: :apiKey

是否有一种方法可以检查是否有特定的make(env:,apiKey:)方法,而不仅仅是带有任何参数的make方法

最简单的方法就是尝试挽救ArgumentError。

begin
thing.make(env: @@__ENV__, apiKey: "myKey")
rescue ArgumentError => e
...guess not...
end

还可以内省Method对象的参数。这将返回一个数组的数组,如[[:key, :env], [:key, :apiKey]]。如果:key是可选的,您正在寻找:keyreq,如果它是必需的。

params = thing.method(:make).parameters
p [:env,:apiKey].all? { |arg|
params.include?([:key,arg]) || params.include?([:keyreq, arg])
}

如果你必须这样做作为应用程序代码的一部分,你可能需要重新考虑你的设计。

相关内容

最新更新