gpt4 book ai didi

ruby - 在模块中嵌套类与使用模块作为类名的一部分

转载 作者:行者123 更新时间:2023-12-04 16:57:31 27 4
gpt4 key购买 nike

类似于 module and class with the same name in Rails project ,但我试图理解为什么将所有内容放在一行中有效,但使用单独的行却行不通。

使用邀请新用户加入帐户。我的 user模型具有最少的验证,并且我使用具有附加行为的子类。这类似于服务对象,但大多数时候子类比服务更干净,因为它们都保存在 /app/models 中。文件夹,更易于维护。

我有 app/models/user/as_invitation.rb .当它看起来像下面这样时,它工作正常:

class ::User::AsInvitation < ::User
# ...
end

但是当我有这个时,它不起作用:“用户不是模块”。
module User
class AsInvitation < ::User
# ...
end
end

我怀疑 Ruby 对模块/类使用相同的命名空间,因为我已经有了 User类(模型),它与 User 发生冲突模块(模块与模型)。

我可以使用 ::User::AsInvitation格式并且它有效,但是当魔术发生时它让我烦恼。作为另一种解决方案,我可以使用模块名称 Users复数,但对我来说使用单数更有意义 User作为命名空间。

我试图了解 Ruby/Rails 如何实现这一点,并确定我是否继续使用 ::User::AsInvitation一方面,我是否会发现自己在没有桨的情况下顺流而下。

最佳答案

@JörgWMittag 在评论中回答了我的问题(如果你想把它放到答案中,我会接受):

module User
end


class User < ActiveRecord::Base
end

两者在 Ruby 中都解析为相同的常量( User )并因此发生碰撞,而:
module User
class AsActive < ActiveRecord::Base
end
end


class ::User::AsActive < ActiveRecord::Base
end

解析为不同的 Ruby 常量( User::AsActiveUser )。模块和类使用相同的常量命名空间(可能不是描述它的最佳词,但对我来说很有意义)。

关于ruby - 在模块中嵌套类与使用模块作为类名的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37795752/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com