我读到here ruby类只能从一个类继承,并且可以include
个模块。
但是,设计模块定义了这样的控制器:
class Users::PasswordsController < Devise::PasswordsController
...
end
现在,鉴于Users
可能是一个类,PasswordsController
是一个方法:
>> Devise::PasswordsController.class
=> Class
类中的方法如何从另一个类继承?
答案 0 :(得分:2)
class Users::PasswordsController < Devise::PasswordsController
...
end
在上面的代码中,Users是模块,PasswordsController是Users模块中的类。类似地,Devise是模块,PasswordsController是Devise模块中的类。
所以当你运行
Users::PasswordsController.class
#=> Class
Users.class
#=>Module
答案 1 :(得分:1)
你在这里感到困惑的是你有错误的假设,即:
Users
可能是一个类
不一定。这里我们有嵌套命名空间,因此Users
可以是类或模块。实际上,类是模块。
PasswordsController
是一种方法
PasswordsController
这是一个嵌套在Users
命名空间中的类。 ::
只是让你进入嵌套树的一个级别。
考虑:
module Foo
class Bar
end
end
Foo::Bar.class # => class
答案 2 :(得分:0)
从Rails命名约定来看,Users
很可能是一个模块,而Users::PasswordsController
是一个类。
请注意,::
不适用于调用类方法(尽管可以这种方式使用)。它用于访问模块/类中的常量。例如
module Foo
BAR = 'bar'
end
Foo::BAR
#=> "bar"
在Ruby中,模块/类名是常量,存储在其中的值是模块/类。所以::
也用于访问另一个模块/类中的模块/类。例如
module Foo
class Bar
end
end
Foo::Bar
#=> Foo::Bar
答案 3 :(得分:0)
用户和设备都是模块,仅用于确定PasswordsController和PasswordsController的实际类。