ruby - Ruby如何命名嵌套类的父类

标签 ruby namespaces ruby-2.0 pundit

在与 Ruby gem Pundit 合作时,我意识到我不确定某些命名空间在 Ruby 中的工作方式,而且我不喜欢在脑海中出现神秘/不确定性。

Pundit 建议您设置一个 application_policy.rb这样:

class ApplicationPolicy
  class Scope
     .
     .
     .
  end
end

类内部实际发生的事情并不重要,重要的是类的结构。

然后您为继承自 ApplicationPolicy 的特定资源指定策略,说 post_policy.rb这样:

class PostPolicy < ApplicationPolicy
  class Scope < Scope
  end
end

我的一般问题是,在我的 PostPolicy 里面,当我声明 Scope < Scope , parent 是什么Scope引用?它会自动在外部类的父类中获得命名空间吗?那么它与继承自ApplicationPolicy::Scope本质上是一样的吗? ?我自己找不到方法来回答这个问题,谢谢!

最佳答案

简答

你在这两个方面都是对的。你可以用 Class#ancestors 查看:

class ApplicationPolicy
  class Scope
  end
end

class PostPolicy < ApplicationPolicy
  class Scope < Scope
  end
end

p PostPolicy::Scope.ancestors
#=> [PostPolicy::Scope, ApplicationPolicy::Scope, Object, Kernel, BasicObject]

等价代码

上面的代码完全一样:

class ApplicationPolicy
end

class ApplicationPolicy::Scope
end

class PostPolicy < ApplicationPolicy
end

class PostPolicy::Scope < ApplicationPolicy::Scope
end

p PostPolicy::Scope.ancestors
#=> [PostPolicy::Scope, ApplicationPolicy::Scope, Object, Kernel, BasicObject]

请注意,PostPolicy::Scope 不继承自 PostPolicy。它们是独立的类,前者恰好定义在后者的命名空间中。

另一种检查方式

class A
  class Scope
  end
end

class B < A
  class Scope < Scope
  end
end

class C
  class Scope < Scope
  end
end

失败:

namespace.rb:26:in `<class:C>': uninitialized constant C::Scope (NameError)
    from namespace.rb:25:in `<main>'

这意味着Scope必须来自A命名空间。

关于ruby - Ruby如何命名嵌套类的父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41268784/

相关文章:

ruby - 将 ruby​​ 类转换为模块比使用改进更好的方法?

ruby - Ruby 2.0 中新的 Tracepoint API 是否使用与 dtrace 相同的探测器?

ruby-on-rails - 使用 Octokit 从组织中检索私有(private)存储库

ruby-on-rails - 我可以将 IP 地址存储为整数吗?

c++ - 命名空间范围问题

ruby-on-rails - rails 3 : Get current namespace?

c# - 读取带和不带命名空间标签的节点

ruby - 为什么 strip 不删除前导空格?

arrays - 在每个点处分割字符串,除非出现某个单词

ruby-on-rails - 如何将 float 转换为 ruby​​ 中的数组?