首页 > 解决方案 > Rubocop cop 找出类上是否存在方法

问题描述

我有以下课程:

class XXX
  def aa
  end

  def authorized?
    false
  end

  def bb
  end
end

并希望确保authorized?Rubocop 存在方法。以下代码适用于 Rubocop 控制台:

code = "
class XXX
  def aa
  end

  def authorized?
    false
  end

  def bb
  end
end
"
node = RuboCop::ProcessedSource.new(code, RUBY_VERSION.to_f).ast
NodePattern.new('(class ... (begin (def :aa ...)(def :authorized? ...)(def :bb ...) ) )').match(node)

最后一行返回true。但是,我不想依赖任何方法。所以我将最后一行替换为

NodePattern.new('(class ... (begin (...)(def :authorized? ...)(...) ) )').match(node)

它有效,代码不依赖于方法的名称。但!我也想让它在没有其他方法存在或有更多方法时工作。

基本上,最终目标是检查方法是否在类上定义。我怎么做?

标签: rubyrubocop

解决方案


我不确定 Rubocop 和节点解析方法,这是其中的一部分,但你可以只使用常规的 Ruby 内省吗?

XXX.instance_methods.include?(:authorized?)

如果它需要在XXX类本身上(而不是任何包含的模块或超类),

XXX.instance_methods.include?(:authorized?) && XXX.instance_method(:authorized?).owner == XXX


推荐阅读