【问题标题】:Can a ruby class method inherit from another class?ruby 类方法可以从另一个类继承吗?
【发布时间】:2016-07-15 13:00:12
【问题描述】:

我读到here 说ruby 类只能从一个类继承,并且可以include 模块。

然而,设计模块定义控制器是这样的:

class Users::PasswordsController < Devise::PasswordsController
  ...
end

现在,鉴于Users 可能是一个类,而PasswordsController 是一个方法:

>> Devise::PasswordsController.class
=> Class

一个类中的方法如何继承另一个类?

【问题讨论】:

  • 据我了解,Users 是一个模块,PasswordsController 是 app/controllers/users/passwords_controllers.rb 里面的类
  • “鉴于 Users 可能是一个类,而 PasswordsController 是一个方法”——我不明白你从哪里得到这个想法。第一次看到嵌套类名?

标签: ruby-on-rails ruby


【解决方案1】:
class Users::PasswordsController < Devise::PasswordsController
...
end

在上面的代码中,Users 是模块,PasswordsController 是 Users 模块中的类。同样,Devise 是模块,PasswordsController 是 Devise 模块中的类。

所以当你运行时

Users::PasswordsController.class
#=> Class
Users.class
#=>Module

【讨论】:

    【解决方案2】:

    这里让你感到困惑的是你有错误的假设,即:


    Users 可能是一个类

    不一定。这里我们有嵌套的命名空间,因此Users 可以是一个类或一个模块。事实上类模块。


    PasswordsController 是一个方法

    PasswordsController 这里是一个嵌套在Users 命名空间中的类。 :: 只是让你进入嵌套树的一层。


    考虑:

    module Foo
      class Bar
      end
    end
    
    Foo::Bar.class # => class
    

    【讨论】:

      【解决方案3】:

      根据 Rails 命名约定,Users 很可能是一个模块,Users::PasswordsController 是一个类。

      请注意,:: 不用于调用类方法(尽管可以这样使用)。它用于访问模块/类中的常量。例如

      module Foo
        BAR = 'bar'
      end
      
      Foo::BAR
      #=> "bar"
      

      在 Ruby 中,模块/类名是一个常量,其中存储的值就是模块/类。所以:: 也用于访问另一个模块/类中的模块/类。例如

      module Foo
        class Bar
        end
      end
      
      Foo::Bar
      #=> Foo::Bar
      

      【讨论】:

        【解决方案4】:

        Users 和 Device 都是模块,仅用于确定 PasswordsController 和 PasswordsController 等真实类的范围。

        【讨论】:

          猜你喜欢
          • 2019-06-13
          • 1970-01-01
          • 2021-12-05
          • 1970-01-01
          • 2011-07-25
          • 2012-05-19
          • 2023-01-24
          • 1970-01-01
          • 2011-01-04
          相关资源
          最近更新 更多