2016-07-15 6 views
0

私はhereを読んでいます。ルビークラスは1つのクラスからしか継承できず、includeモジュールです。ruby​​クラスのメソッドは別のクラスから継承できますか?

しかし、工夫モジュールは、このようなコントローラを定義しています

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

UsersPasswordsControllerが法であることと、おそらくクラスであることを考える:

それは方法ということですどのように
>> Devise::PasswordsController.class 
=> Class 

あるクラスは別のクラスを継承していますか?

+1

は、私の理解によると、ユーザーはモジュールであり、PasswordsControllerユーザーは、おそらくクラスであることを考えるとアプリ/コントローラ/ユーザ/ passwords_controllers.rb – power

+0

」内にあるクラスでありますPasswordsControllerはメソッドである " - 私はあなたがこのアイデアをどこから得たか分かりません。最初にネストされたクラス名を確認しますか? –

答えて

2

上記のコードでは、Usersはモジュールであり、PasswordsControllerはUsersモジュール内のクラスです。同様にDeviseはモジュールであり、PasswordsControllerはDeviseモジュール内のクラスです。


Usersはおそらく、必ずしもクラス

されていません:

ので、あなたが実行したときに

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

Railsの命名規則から、Usersはおそらくモジュールであり、Users::PasswordsControllerはクラスです。

::はクラスメソッドを呼び出すためのものではありません(ただし、この方法で使用できます)。これは、モジュール/クラス内の定数にアクセスするためのものです。たとえば、

module Foo 
    BAR = 'bar' 
end 

Foo::BAR 
#=> "bar" 

ルビーでは、モジュール/クラス名は定数であり、その値はモジュール/クラスです。したがって::は、別のモジュール/クラス内のモジュール/クラスにアクセスするためにも使用されます。たとえば、

module Foo 
    class Bar 
    end 
end 

Foo::Bar 
#=> Foo::Bar 
0

ユーザーとデバイスの両方は、PasswordsControllerとPasswordsControllerである実際のクラスのスコープにのみ使用されるモジュールです。

1

何ここであなたを混乱させるすることで、つまり、間違った仮定を持っているということです。ここでは名前空間にネストがあるため、Usersはクラスまたはモジュールのいずれかになります。実際にクラスモジュールです。


PasswordsControllerここに方法

PasswordsControllerUsers名前空間内にネストされたクラスです。 ::では、1つのレベルを入れ子にすることができます。


は考えてみましょう:

module Foo 
    class Bar 
    end 
end 

Foo::Bar.class # => class 
関連する問題