检查内插方法调用是否未定义

check if a interpolated method call is undefined

我有一个内插方法调用,send("#{k}_track", k, v)。 我想 运行 检查是否定义了正在调用的方法。

类似 next if send("#{k}_track", k, v) == undefined 的内容。 正在调用的方法只是服务中的一个独立方法。

我试过使用 trymethod_defined? 但运气不好。他们只是 return 相同的未定义方法错误。 所以我不确定这是否可能。

使用Object#respond_to?:

send("#{k}_track", k, v) if respond_to?("#{k}_track")

或者在接下来的情况下:

next unless respond_to?("#{k}_track")
send("#{k}_track", k, v)

您可能需要 respond_to? instead of method_defined?。这取决于您是检查实例还是检查 class 方法。例如,让我们看一下 String,它是 upcase 方法。

"foo".respond_to?("upcase")
=> true

这意味着您可以在 "foo" 上调用 upcase,例如"foo".upcase.

String.method_defined?("upcase")
=> true

这与通知您 String 实例响应 upcase 大致相同。

现在,让我们看看当我们尝试在一个实例上调用 method_defined? 时会发生什么:

"".method_defined?("upcase")
NoMethodError (undefined method `method_defined?' for "":String)

这是有道理的,因为 method_defined? 存在于 String 但 不存在 一个 String 实例。

如果没有更多的上下文很难说清楚,但总而言之,我想在你的情况下你可能想使用 respond_to? 而你看到的错误是调用 method_defined?实例.