在与 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/