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


112

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


1
後者はどこで見ましたか?
Darin Dimitrov

18
klassのように、Classオブジェクトを保持する変数に名前を付けるために一般的に使用されます(クラスもオブジェクトであることを忘れないでください)klass = String。より深い説明のために、それをどこで見たかのソースを提供できますか?
チュバス2010年

5
いいえ、そのように説明したくないので、単一のソースを提供したくありません。私はこれについてより大きな絵を望んでいます
thenengah 2010年

5
時々、人々clazzklass(例えば、本「メタプログラミングRuby」で)よりもむしろ使用します。
Andrew Grimm

2
TV Tropesでは、これは「Xtreme Kool Letterz」と呼ばれます(リンクなし-生産性の面で安全ではありません)。
Andrew Grimm

回答:


188

class新しいクラスを定義するために使用されるキーワードです。これは予約済みのキーワードであるため、変数名として使用することはできません。Rubyのキーワードを変数名として使用することはできないため、defor moduleifor end、or などの変数を指定することはできません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では大文字と小文字が区別されることに注意してください。大文字で始まるトークンは定数です。つるはし経由:

定数名は大文字で始まり、その後に名前文字が続きます。クラス名とモジュール名は定数であり、定数の命名規則に従います。慣例により、定数変数は通常、全体にわたって大文字とアンダースコアを使用してスペルされます。

したがって、正しいスペルはclassand klassではなくClassand Klassです。後者は定数であり、両方のだろうClassKlass、有効な定数の名前ですが、私は明確にするためにそれらを使用しないことをお勧めします。


7
まあ、Class特に有効な定数名であるだけでなく、現存する名前でもあります!(これはClassクラスです)
Asherah 2010年

1
すごい綺麗。今、完全に理解します。クリス、ありがとう!:)
thenengah 2010年

1
klassローカル変数としてのの使用はつるはしに由来すると思います-ここで説明した理由から、いくつかの例でその名前を使用しています。
ケンブルーム

これは古いルビバージョンを適用する必要があります。Ruby 1.9.3で使用するobject_instance.class.name == 'Object'
Augustin Riedinger、2015年

いいえ、まだ正確です。Object.newのクラスはObjectですが、ObjectのクラスはClassです。
Chris Heald

22

klassRails(またはActiveRecord)メソッドでもあります。関連付けのクラスを取得するために使用されます。

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

class Author < ActiveRecord::Base
  has_many :books
end

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

12

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

これは、使用することを目に不快感を与えるはるかに少ないだろうclass1か、clあるいはclassX意図的なスペルミスではなく、または何かを。


5

1つはクラスの名前で、もう1つはデフォルトでは未定義の定数です。そして、あなたが見て可能性が高くなりますペアのために、classそしてklass後者はちょうど識別子は(文字の他の文字列のような)であるのに対し、前者はクラスを定義するためのキーワードです。「クラス」という言葉を書きたいときに使用しますが、予約済みのキーワードなので使用できません。


ポイントは何ですか、つまり、なぜ/どのように使用するのか、通常何に使用するのですか?
thenengah 2010年

3
@Samクラスは、クラスを定義するための予約済みキーワードです。したがって、(メタプログラミングなどの)汎用クラスを処理したい場合は、を作成できませんclass = Kernel.const_get(class_name)。しかし、あなたは書くことができklass = Kernel.const_get(class_name)、それは「クラス」を表すために使用されます。
チアゴ・シルベイラ

2
重要なのは、キーワード「クラス」を使用して「クラス」を意味することはできないということです...これは予約語(循環論理、わかっています)なので、代わりに「クラス」という単語に置き換えられます。これは、JavaやC#など、他の多くの言語で一般的なイディオムです。
スコット

あなたは動的にクラスを割り当てることができますか?クラス= object.class; Klass.new-そのようなもの
thenengah 2010年

3
@Sam:Klass大文字で始まる識別子は定数であるため、1回しか設定できないため、forを使用するのは適切ではありません。しかし、はい、それは一般的な考えです。
チャック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.