2

クラスが内部でどのように宣言されているか、およびクラスが宣言されたときに何が起こるかについて、いくつかのコードを試していました。クラスが宣言されると、「クラス」のオブジェクトが作成され、宣言されたクラスの名前を持つ定数が作成されることがわかりました。例えば

MyClass = Class.new
MyClass.class => Class
MyClass.superclass => Object
Class.constants.include? :MyClass => true

私も試しました

x = Class.new => #<Class:0xd886938> 
x.class => Class 
x.superclass => Object 
Class.constants.include? :x => false #why so???

「x」がクラスであることを意味します。私は混乱した原因

class x
  def say_hi 
    'hi'
  end
end

与える

SyntaxError: (irb):121: class/module name must be CONSTANT

なぜこうなった?

- -アップデート - -

私は試した

def x.x_method
  'x class method'
end

そしてやった

x.methods.include? :x_method => true

同様に

x.singleton_methods.include? :x_method => true

そして主に

x.methods - MyClass.methods => [:x_method]

上記の行xは、 class のオブジェクトであるため、それがクラスであることを示していますClass。すべてのユーザー定義クラスは class のオブジェクトであるため、特定のクラスに対してシングルトン メソッドが宣言されていない限り (上記の場合はシングルトン メソッドClassがあります)、それらの初期メソッドも同じである必要があります。x

x => #<Class:0xd886938>
obj_x = x.new  => #<#<Class:0xd886938>:0xd30caac> 
obj_x.class => #<Class:0xd886938> 

上記のコードxは、新しいオブジェクトを作成できるため、クラスであるという仮定をさらに強化します。xインスタンスだった場合、newエラーで失敗します。

私の質問は、なぜ ruby​​ で特定の方法でクラスを宣言できるのですか? それがクラスではない場合、なぜクラスのように振る舞うのですか?

4

2 に答える 2

4

Ruby インタープリターは、大文字で始まるものだけを定数として認識します。そのため、「クラス」xは含まれていませんClass.constants

これから: _

命名規則

Ruby では、いくつかの命名規則が適用されます。識別子が大文字で始まる場合、それは定数です。ドル記号 ($) で始まる場合、それはグローバル変数です。@ で始まる場合は、インスタンス変数です。@@ で始まる場合は、クラス変数です。

クラス名は定数であると想定されているため、xコードではクラスの名前ではありません。クラスを保持する変数であり、たまたま適切な名前が割り当てられていません。(@ZachKempの回答で提案されているように、入力x.nameしてそれが返されるのを確認することで確認できます)nil

つまり、Ruby ではクラスに小文字で始まる名前を付けることはできません。

于 2013-07-08T18:32:50.040 に答える
2

お気づきのように、Ruby ではクラスをファースト クラス オブジェクトとして扱うことができます。として新しいクラスを作成する場合x = Class.new、クラス インスタンス オブジェクトを変数に割り当てますが、これは名前を付けることと同じではありません (クエリ メソッドを送信してx.name、名前が であることを確認できますnil)。次に、その変数を定数 ( MyClass = x) に割り当てて、永続的な名前を付けることができます。

宣言は、class定数で始まることを期待するキーワードです。クラスを作成する両方の方法で同じもの ( のインスタンスClass) が作成され、どちらの方法を使用してもかまいません (ただし、最初の方法は通常、特別な状況でのみ使用されます)。

于 2013-07-08T18:34:09.990 に答える