Apa perbedaan antara Class dan Klass di ruby?

112

Apa perbedaan antara Class dan Klass?

thenengah
sumber
1
Di mana Anda melihat yang terakhir?
Darin Dimitrov
18
klassbiasanya digunakan untuk memberi nama variabel yang menampung Classobjek (ingat kelas adalah objek juga), seperti pada klass = String. Dapatkah Anda memberikan sumber dari mana Anda pernah melihatnya untuk penjelasan yang lebih dalam?
Chubas
5
Tidak, saya tidak ingin memberikan sumber tunggal karena saya tidak ingin dijelaskan seperti itu. Saya ingin gambaran yang lebih besar tentang ini
pertengahan
5
Kadang-kadang, orang menggunakan clazzdaripada klass(misalnya, dalam buku "Metaprogramming Ruby").
Andrew Grimm
2
Di TV Tropes, ini disebut "Xtreme Kool Letterz" (tidak ada tautan - tidak aman produktivitas).
Andrew Grimm

Jawaban:

188

classadalah kata kunci yang digunakan untuk mendefinisikan kelas baru. Karena ini adalah kata kunci yang dipesan, Anda tidak dapat menggunakannya sebagai nama variabel. Anda tidak dapat menggunakan kata kunci Ruby apa pun sebagai nama variabel, jadi Anda tidak akan dapat memiliki variabel bernama defatau moduleatau ifatau end, dll - classtidak berbeda.

Misalnya, pertimbangkan hal berikut:

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

Mencoba menjalankan ini menghasilkan kesalahan, karena Anda tidak dapat menggunakan classsebagai nama variabel.

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

Untuk memperbaikinya, kami akan menggunakan pengenal klasssebagai gantinya. Ini tidak istimewa, tetapi secara konvensional digunakan sebagai nama variabel saat Anda berurusan dengan nama kelas atau kelas. Secara fonetik sama, tetapi karena ini bukan kata kunci yang dipesan, Ruby tidak memiliki masalah dengannya.

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

show_methods "Kernel"

Output, seperti yang diharapkan

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

Anda dapat menggunakan nama variabel (tidak dicadangkan) di sana, tetapi komunitas telah menggunakannya klass. Itu tidak memiliki sihir khusus - itu hanya berarti "Saya ingin menggunakan nama 'kelas' di sini, tetapi saya tidak bisa, karena ini adalah kata kunci yang dipesan".

Di samping catatan, karena Anda salah mengetik beberapa kali, perlu diperhatikan bahwa di Ruby, kasus penting. Token yang dimulai dengan huruf kapital adalah konstanta. Melalui beliung :

Nama konstanta dimulai dengan huruf besar diikuti dengan karakter nama. Nama kelas dan nama modul adalah konstanta, dan mengikuti konvensi penamaan yang konstan. Sesuai ketentuan, variabel konstan biasanya dieja menggunakan huruf besar dan garis bawah.

Jadi, ejaan yang benar adalah classdan klass, bukan Classdan Klass. Yang terakhir akan menjadi konstanta, dan keduanya Classdan Klassmerupakan nama konstanta yang valid, tetapi saya akan merekomendasikan agar tidak menggunakannya untuk tujuan kejelasan.

Chris Heald
sumber
7
Nah, tidak hanya Classnama konstanta yang valid, tetapi juga nama yang masih ada! (Ini kelas Kelas)
Asherah
1
Wow cantik. Sepenuhnya mengerti sekarang. Terima kasih Chris! :)
kemudianengah
1
Saya pikir penggunaan klasssebagai variabel lokal berasal dari beliung - mereka menggunakan nama itu dalam beberapa contoh, tepat untuk alasan yang Anda jelaskan di sini.
Ken Bloom
Ini harus menerapkan versi ruby ​​lama. Dengan Ruby 1.9.3 saya menggunakanobject_instance.class.name == 'Object'
Augustin Riedinger
Tidak, itu masih akurat. Kelas dari Object.new adalah Object, tetapi kelas dari Object adalah Class.
Chris Heald
22

klassjuga merupakan Rails (atau lebih tepatnya ActiveRecord) metode . Ini digunakan untuk mendapatkan kelas asosiasi.

Seperti yang dinyatakan dalam konten tertaut:

class Author < ActiveRecord::Base
  has_many :books
end

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

klassdan clazzdan claszdan sejenisnya adalah salah eja kreatif yang digunakan untuk menyiasati kata yang sudah dipesan class.

Ini akan menjadi jauh lebih sedikit menggelegar pada mata untuk menggunakan class1atau clatau classXatau sesuatu daripada kesalahan ejaan disengaja.

Jason S
sumber
5

Salah satunya adalah nama kelas dan yang lainnya hanyalah konstanta tak terdefinisi secara default. Dan untuk pasangan Anda lebih cenderung melihat, classdan klass, yang pertama adalah kata kunci untuk mendefinisikan kelas sedangkan yang terakhir hanya pengenal (seperti string karakter lainnya). Ini digunakan ketika Anda ingin menulis kata "class" tetapi tidak bisa karena ini adalah kata kunci yang dipesan.

Membuang
sumber
Apa gunanya maksud saya kenapa / bagaimana menggunakannya, biasanya digunakan untuk apa?
pertengahan
3
Kelas @ Sam adalah kata kunci yang disediakan untuk mendefinisikan kelas. Jadi, jika Anda ingin menangani sesuatu dengan kelas generik (seperti metaprogramming), Anda tidak dapat menulis class = Kernel.const_get(class_name). Tapi Anda bisa menulis klass = Kernel.const_get(class_name), dan itu digunakan untuk mewakili "kelas".
Thiago Silveira
2
Intinya adalah Anda tidak dapat menggunakan kata kunci 'class' untuk berarti 'class' ... karena ini adalah kata yang dicadangkan (logika melingkar, saya tahu) sehingga kata 'klass' diganti. Ini adalah idiom umum di banyak bahasa lain, misalnya Java dan C #.
Scott
sehingga Anda dapat menetapkan kelas secara dinamis? Klass = object.class; Klass. Baru - kira-kira seperti itu
tengah
3
@ Sam: Menggunakan Klassuntuk itu akan menjadi pilihan yang buruk, karena pengenal yang dimulai dengan huruf besar adalah konstanta, jadi Anda hanya dapat menyetelnya sekali. Tapi ya, itu gambaran umumnya.
Chuck