Ruby'de Class ve Klass arasındaki fark nedir?


113

Class ve Klass arasındaki fark nedir?


1
İkincisini nerede gördünüz?
Darin Dimitrov

18
klassgenellikle içinde olduğu gibi bir Classnesneyi tutan bir değişkeni adlandırmak için kullanılır (sınıfların da nesneler olduğunu unutmayın) klass = String. Daha derin bir açıklama için onu nerede gördüğünüzün kaynağını sağlayabilir misiniz?
Chubas

5
Hayır, tek bir kaynak sağlamak istemiyorum çünkü bu şekilde açıklanmasını istemiyorum. Bunun hakkında daha büyük bir resim istiyorum
thenengah

5
Bazen insanlar clazzyerine kullanırlar klass(örneğin, "Metaprogramming Ruby" kitabında).
Andrew Grimm

2
TV Tropes'da buna "Xtreme Kool Letterz" adı verilir (bağlantı yok - üretkenlik güvenli değil).
Andrew Grimm

Yanıtlar:


189

classyeni bir sınıfı tanımlamak için kullanılan bir anahtar kelimedir. Ayrılmış bir anahtar kelime olduğu için, onu değişken adı olarak kullanamazsınız. Ruby'nin anahtar kelimelerinden herhangi birini değişken adları olarak kullanamazsınız, bu nedenle defveya moduleveya ifveya endvb. Adlı değişkenlere sahip olamazsınız - classfarklı değildir.

Örneğin, şunları düşünün:

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

classDeğişken adı olarak kullanamayacağınız için bunu çalıştırmaya çalışmak bir hatayla sonuçlanır .

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

Düzeltmek için klassbunun yerine tanımlayıcıyı kullanacağız . Özel değildir, ancak bir sınıf veya sınıf adıyla uğraşırken geleneksel olarak değişken adı olarak kullanılır. Fonetik olarak aynıdır, ancak ayrılmış bir anahtar kelime olmadığı için Ruby'de herhangi bir sorun yoktur.

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

show_methods "Kernel"

Beklendiği gibi çıktı

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

Orada herhangi bir (ayrılmamış) değişken adı kullanabilirsiniz, ancak topluluk kullanmaya başladı klass. Özel bir sihri yoktur - sadece "Burada 'sınıf' adını kullanmak istedim, ancak ayrılmış bir anahtar kelime olduğu için yapamıyorum" anlamına gelir.

Bir yan not olarak, birkaç kez yanlış yazdığınız için, Ruby'de durum önemlidir. Büyük harfle başlayan simgeler sabitlerdir. Via kazma :

Sabit bir ad, büyük harfle başlar ve ardından ad karakterleri gelir. Sınıf adları ve modül adları sabittir ve sabit adlandırma kurallarına uyar. Geleneksel olarak, sabit değişkenler normalde baştan sona büyük harfler ve alt çizgiler kullanılarak yazılır.

Bu nedenle, doğru yazım, classve klassyerine Classve şeklindedir Klass. İkincisi sabitler olmak ve her iki ediyorum Classve Klassgeçerli sabit isimleri vardır, ama netlik amacıyla kullanılmasının karşı öneriyoruz.


7
Eh, sadece Classgeçerli bir sabit isim değil, aynı zamanda var olan bir isimdir! (Sınıf sınıfı)
Asherah

1
Çok güzel. Şimdi tamamen anlayın. Teşekkürler Chris! :)
thenengah

1
klassYerel değişken olarak kullanımının kazmadan geldiğini düşünüyorum - bu adı birkaç örnekte kullandılar, tam olarak burada anlattığınız nedenlerden dolayı.
Ken Bloom

Bu, eski yakut versiyonunu uygulamalıdır. Ruby 1.9.3 ile kullanıyorumobject_instance.class.name == 'Object'
Augustin Riedinger

Hayır, hala doğru. Object.new sınıfı Object'tir, ancak Object sınıfı Class'tır.
Chris Heald

23

klassaynı zamanda bir Rails (veya daha doğrusu ActiveRecord) yöntemidir . Bir derneğin sınıfını almak için kullanılır.

Bağlantılı içerikte belirtildiği gibi:

class Author < ActiveRecord::Base
  has_many :books
end

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

12

klassve clazzve claszbenzeri şeyler, ayrılmış bir kelimeyi aşmak için kullanılan yaratıcı yazım hatalarıdır.class .

Kasıtlı bir yazım hatası yerine ya class1da clya classXda başka bir şeyi kullanmak gözler için çok daha az sarsıcı olacaktır .


5

Biri bir sınıfın adıdır ve diğeri varsayılan olarak sadece tanımsız bir sabittir. Ve çift için görme olasılığınız daha yüksektir classve klassilki, sınıfları tanımlamak için bir anahtar sözcük iken, ikincisi yalnızca bir tanımlayıcıdır (diğer tüm karakter dizileri gibi). "Sınıf" kelimesini yazmak istediğinizde kullanılır, ancak ayrılmış bir anahtar kelime olduğu için yapamazsınız.


Ne anlamı var, yani neden / nasıl kullanılıyor, genellikle ne için kullanılıyor?
thenengah

3
@Sam sınıfı, sınıfları tanımlamak için ayrılmış bir anahtar sözcüktür. Dolayısıyla, genel bir sınıfla (metaprogramlama gibi) bir şeyle uğraşmak istiyorsanız, yazamazsınız class = Kernel.const_get(class_name). Ama yazabilirsiniz klass = Kernel.const_get(class_name)ve bu "sınıfı" temsil etmek için kullanılır.
Thiago Silveira

2
Mesele şu ki, 'sınıf' anlamında 'sınıf' anahtar kelimesini kullanamazsınız ... çünkü bu ayrılmış bir kelimedir (döngüsel mantık, biliyorum), bu nedenle 'klass' kelimesi yerine geçer. Bu, diğer birçok dilde yaygın bir deyimdir, örneğin Java ve C #.
Scott

böylece dinamik olarak sınıf atayabilirsiniz? Klass = object.class; Klass.new - bunun gibi bir şey
thenengah

3
@Sam: Bunun için kullanmak Klasskötü bir seçimdir, çünkü büyük harflerle başlayan tanımlayıcılar sabittir, bu yüzden sadece bir kez ayarlayabilirsiniz. Ama evet, genel fikir bu.
Chuck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.