Rubocop cop找出类中是否存在方法

时间:2019-04-05 18:55:18

标签: ruby rubocop

我有以下课程:

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)

它有效,代码不依赖于方法的名称。但!我也想在没有其他方法或没有其他方法的情况下使它工作。

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

1 个答案:

答案 0 :(得分:1)

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

XXX.instance_methods.include?(:authorized?)

如果它本身必须位于XXX类中(与任何包含的模块或超类相对),

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