web-dev-qa-db-ja.com

ルビーのクラスとクラスの違いは何ですか?

クラスとクラスの違いは何ですか?

103
thenengah

classは、新しいクラスを定義するために使用されるキーワードです。予約キーワードなので、変数名として使用することはできません。 Rubyのキーワードは変数名として使用できないため、defまたはmoduleまたはifまたはendなどの名前の変数を持つことはできません- classも同様です。

たとえば、次のことを考慮してください。

def show_methods(class)
  puts Object.const_get(class).methods.inspect
end
show_methods "Kernel"

変数名としてclassを使用できないため、これを実行しようとするとエラーが発生します。

test.rb:1: syntax error, unexpected kCLASS, expecting ')'
    def show_methods(class)
                          ^
test.rb:2: syntax error, unexpected ')'
      puts Object.const_get(class).methods.inspect

修正するには、代わりに識別子klassを使用します。特別なものではありませんが、クラスまたはクラス名を処理するときに変数名として従来使用されています。音声的には同じですが、予約キーワードではないため、Rubyは問題ありません。

def show_methods(klass)
  puts Object.const_get(klass).methods.inspect
end

show_methods "Kernel"

予想どおり、出力は

["method", "inspect", "name", "public_class_method", "chop!"...

ここでは、任意の(予約されていない)変数名を使用できますが、コミュニティはklassを使用することになりました。特別な魔法はありません-「ここでは「クラス」という名前を使用したかったのですが、予約キーワードなので使用できません」という意味です。

ちなみに、あなたはそれを数回間違えてタイプしたので、Rubyでは大文字と小文字が区別されることに注意する価値があります。大文字で始まるトークンは定数です。 Pickaxe を介して:

定数名は、大文字で始まり、名前の文字が続きます。クラス名とモジュール名は定数であり、定数の命名規則に従います。慣例により、定数変数は通常、全体を通して大文字と下線を使用して綴られます。

したがって、正しいスペルはclassおよびklassではなく、ClassおよびKlassです。後者は定数であり、ClassKlassは両方とも有効な定数名ですが、わかりやすくするために使用しないことをお勧めします。

178
Chris Heald

klassは、Rails(またはActiveRecord) method です。関連付けのクラスを取得するために使用されます。

リンクされたコンテンツで述べられているように:

class Author < ActiveRecord::Base
  has_many :books
end

Author.reflect_on_association(:books).klass
# => Book
17
DazBaldwin

klassおよびclazzおよびclaszなどは、予約語classを回避するために使用される創造的なミススペルです。

class1またはclまたはclassXまたは意図的なスペルミスではなく何か。

12
Jason S

1つはクラスの名前で、もう1つはデフォルトでは未定義の定数です。 classklassのペアの場合、前者はクラスを定義するためのキーワードであり、後者は単なる識別子です(他の文字列と同様)。 Wordの「クラス」を書きたいときに使用しますが、予約キーワードであるため使用できません。

5
Chuck