Jaka jest różnica między Class i Klass in ruby?


112

Jaka jest różnica między Class i Klass?


1
Gdzie widziałeś to drugie?
Darin Dimitrov

18
klassjest powszechnie używany do nazwania zmiennej, która przechowuje Classobiekt (pamiętaj, że klasy też są obiektami), tak jak w klass = String. Czy możesz podać źródło, w którym go widziałeś, aby uzyskać głębsze wyjaśnienie?
Chubas

5
Nie, nie chcę podawać jednego źródła, ponieważ nie chcę, aby zostało to wyjaśnione w ten sposób. Chcę mieć większy obraz na ten temat
thenengah

5
Czasami ludzie używają clazzzamiast klass(na przykład w książce „Metaprogramowanie języka Ruby”).
Andrew Grimm

2
W TV Tropes będzie to nazywane „Xtreme Kool Letterz” (brak połączenia - brak bezpieczeństwa produktywności).
Andrew Grimm,

Odpowiedzi:


188

classto słowo kluczowe używane do definiowania nowej klasy. Ponieważ jest to zarezerwowane słowo kluczowe, nie możesz go użyć jako nazwy zmiennej. Nie możesz używać słów kluczowych Rubiego jako nazw zmiennych, więc nie będziesz mógł mieć zmiennych o nazwach deflub modulelub iflub end, itd. - classnie jest inaczej.

Na przykład rozważ następujące kwestie:

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

Próba uruchomienia tego skutkuje błędem, ponieważ nie możesz użyć classjako nazwy zmiennej.

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

Aby to naprawić, użyjemy klasszamiast tego identyfikatora . Nie jest wyjątkowa, ale jest konwencjonalnie używana jako nazwa zmiennej, gdy masz do czynienia z klasą lub nazwą klasy. Fonetycznie jest to samo, ale ponieważ nie jest to zastrzeżone słowo kluczowe, Ruby nie ma z nim żadnych problemów.

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

show_methods "Kernel"

Wynik, zgodnie z oczekiwaniami, to

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

Możesz użyć dowolnej (niezarezerwowanej) nazwy zmiennej, ale społeczność zaczęła używać klass. Nie ma żadnej specjalnej magii - oznacza po prostu „Chciałem użyć tutaj nazwy„ klasa ”, ale nie mogę, ponieważ jest to zastrzeżone słowo kluczowe”.

Na marginesie, ponieważ kilka razy wpisałeś go nieprawidłowo, warto zauważyć, że w Rubim sprawa ma znaczenie. Tokeny zaczynające się wielką literą to stałe. Za pomocą kilofa :

Stała nazwa zaczyna się od dużej litery, po której następują znaki nazwy. Nazwy klas i nazwy modułów są stałymi i są zgodne ze stałą konwencją nazewnictwa. Zgodnie z konwencją, stałe zmienne są zwykle zapisywane przy użyciu wielkich liter i znaków podkreślenia.

Zatem prawidłowa pisownia to classi klass, a nie Classi Klass. To ostatnie byłoby stałe i oba Classi Klasssą ważne nazwy stałych, ale polecam przed wykorzystaniem ich do celów przejrzystości.


7
Cóż, jest to nie tylko Classpoprawna stała nazwa, ale także istniejąca! (to klasa Class)
Asherah

1
O rany, piękny. Całkowicie zrozum teraz. Dzięki Chris! :)
thenengah

1
Myślę, że użycie klasszmiennej lokalnej jako zmiennej lokalnej pochodzi z Kilofa - używali tej nazwy w kilku przykładach, dokładnie z powodów, które tutaj opisałeś.
Ken Bloom,

To musi dotyczyć starej wersji ruby. Używam Rubiego 1.9.3object_instance.class.name == 'Object'
Augustin Riedinger,

Nie, nadal jest dokładna. Klasa Object.new to Object, ale klasa Object to Class.
Chris Heald

22

klassjest również metodą Railsów (a raczej ActiveRecord) . Służy do pobierania klasy asocjacji.

Jak podano w połączonej treści:

class Author < ActiveRecord::Base
  has_many :books
end

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

12

klassi clazzi clasztym podobne to twórcze błędy ortograficzne używane do obejścia zastrzeżonego słowa class.

Byłoby znacznie mniej rażący w oczy użycie class1lub cllub classXlub coś zamiast umyślne błąd ortograficzny.


5

Jedna to nazwa klasy, a druga to domyślnie niezdefiniowana stała. I dla pary jesteś bardziej prawdopodobne, aby zobaczyć, classi klass, ten pierwszy jest kluczowe dla określenia klasy, a drugi jest tylko identyfikator (jak każdy inny ciąg znaków). Jest używany, gdy chcesz napisać słowo „klasa”, ale nie możesz, ponieważ jest to zastrzeżone słowo kluczowe.


Jaki jest sens, mam na myśli, dlaczego / jak go używać, do czego jest zwykle używany?
thenengah

3
Klasa @Sam jest zastrzeżonym słowem kluczowym do definiowania klas. Więc jeśli chcesz mieć do czynienia z klasą ogólną (np. Metaprogramowaniem), nie możesz pisać class = Kernel.const_get(class_name). Ale możesz pisać klass = Kernel.const_get(class_name), a to reprezentuje „klasę”.
Thiago Silveira

2
Chodzi o to, że nie można używać słowa kluczowego „class” na oznaczenie „class”… ponieważ jest to słowo zastrzeżone (logika okrężna, wiem), więc zamiast niego jest zastępowane słowo „klass”. Jest to popularny idiom w wielu innych językach, np. Java i C #.
Scott

więc możesz dynamicznie przypisywać zajęcia? Klass = object.class; Klass.new - coś takiego
thenengah

3
@Sam: użycie Klassdo tego byłoby kiepskim wyborem, ponieważ identyfikatory zaczynające się od wielkich liter są stałymi, więc możesz je ustawić tylko raz. Ale tak, to jest ogólna idea.
Chuck
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.