【问题标题】:check if a interpolated method call is undefined检查内插方法调用是否未定义
【发布时间】:2020-09-30 23:29:42
【问题描述】:

我有一个插值方法调用,send("#{k}_track", k, v)。 我想检查一下被调用的方法是否已定义。

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

我尝试过使用try 或method_defined?,但运气不佳。它们只是返回相同的未定义方法错误。 所以我不确定这是否可能。

【问题讨论】:

  • “我尝试过使用 try 或 method_defined?...” – 你能展示你的尝试吗?

标签: ruby-on-rails ruby methods string-interpolation


【解决方案1】:

您可能需要respond_to? 而不是method_defined?。这取决于您是在检查实例方法还是类方法。比如我们看一下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?。

【讨论】:

  • 使用respond_to? 和duck typing 比method_defined? 更常用,这实际上主要用于元编程。
【解决方案2】:

使用Object#respond_to?:

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

或者在下一个的情况下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    相关资源
    最近更新 更多