Ruby命名空间如何定义嵌套类的父类

Ruby命名空间如何定义嵌套类的父类,ruby,namespaces,ruby-2.0,pundit,Ruby,Namespaces,Ruby 2.0,Pundit,在与Ruby gem专家合作时,我意识到我不确定Ruby中某些名称空间的工作方式,我不喜欢头脑中的神秘/不确定性 权威人士建议您设置一个应用程序\u policy.rb,以便: class ApplicationPolicy class Scope . . . end end class PostPolicy < ApplicationPolicy class Scope < Scope end end 类内部实际发生的事情并不重要,

在与Ruby gem专家合作时,我意识到我不确定Ruby中某些名称空间的工作方式,我不喜欢头脑中的神秘/不确定性

权威人士建议您设置一个
应用程序\u policy.rb
,以便:

class ApplicationPolicy
  class Scope
     .
     .
     .
  end
end
class PostPolicy < ApplicationPolicy
  class Scope < Scope
  end
end
类内部实际发生的事情并不重要,重要的是类的结构

然后为从
ApplicationPolicy
继承的特定资源指定策略,例如
post\u policy.rb
,如下所示:

class ApplicationPolicy
  class Scope
     .
     .
     .
  end
end
class PostPolicy < ApplicationPolicy
  class Scope < Scope
  end
end
类后策略

我的一般问题是,在我的
后期政策
中,当我声明
范围
时,父
范围
指的是什么?它是否在外部类的父类中自动获得名称空间?那么,它本质上与从
ApplicationPolicy::Scope
继承相同吗?我自己很难找到答案,谢谢

很容易找到自己:

class C1; class Nested; end; end
class C2<C1; class Nested<Nested; end; end

C2::Nested.ancestors
#⇒ [
#  [0] C2::Nested < C1::Nested,
#  [1] C1::Nested < Object,
#  [2] Object < BasicObject,
#  [3] PP::ObjectMixin,
#  [4] Kernel,
#  [5] BasicObject
# ]
C1类;类嵌套;结束;结束
课堂简短回答
在这两方面你都是对的。您可以通过以下方式进行检查:

在以下情况下失败:

namespace.rb:26:in `<class:C>': uninitialized constant C::Scope (NameError)
    from namespace.rb:25:in `<main>'
namespace.rb:26:in`:未初始化的常量C::Scope(NameError)
来自namespace.rb:25:in`'

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

谢谢您的快速回复,很抱歉花了一些时间回复。你的回答太棒了,太彻底了!非常感谢。出于某种原因,
class Scope
的缩写实际上指的是
ApplicationPolicy::Scope
,这对我来说似乎并不自然,也不是我所期望的,但我想这就是它的方式,至少现在我明白了!有一件有趣而又让人稍感困惑的事情是以下场景:[1]pry(main)>类C1[1]pry(main)*end=>nil[2]pry(main)>类C2通过不定义
C1::Nested
,错误消息是
namererror:uninitialized constant C2::Nested
。不客气。我同意语法有点太复杂了。我不会把它用于任何应该被其他人阅读的东西。感谢你展示你是如何决定它的,谢谢!有一件有趣且令人稍感困惑的事情是以下场景:[1]pry(main)>类C1[1]pry(main)*end=>nil[2]pry(main)>类C2因此,通过不定义C1::Nested,错误消息是NameError:uninitialized constant C2::Nested,这对您有意义吗?
namespace.rb:26:in `<class:C>': uninitialized constant C::Scope (NameError)
    from namespace.rb:25:in `<main>'