Pytanie Jaka jest różnica między klasą a Klass w rubinach?


Jaka jest różnica między klasą a klasą?


91
2017-11-28 21:49


pochodzenie


Gdzie widziałeś to drugie? - Darin Dimitrov
klass jest powszechnie używany do nazwania zmiennej, która posiada Class obiekt (pamiętaj, że klasy też są obiektami), jak w klass = String. Czy możesz podać źródło tego, gdzie go widziałeś, aby uzyskać głębsze wyjaśnienie? - Chubas
Nie, nie chcę dostarczać jednego źródła, ponieważ nie chcę, aby było to wyjaśnione w ten sposób. Chcę uzyskać większy obraz na ten temat - thenengah
Czasami ludzie używają clazz zamiast klass (na przykład w książce "Metaprograming Ruby"). - Andrew Grimm
W TV Tropes nazywałby się "Xtreme Kool Letterz" (brak linku - nie jest bezpieczny pod względem produktywności). - Andrew Grimm


Odpowiedzi:


class to słowo kluczowe używane do definiowania nowej klasy. Ponieważ jest zarezerwowanym słowem kluczowym, nie możesz użyć go jako nazwy zmiennej. Nie możesz użyć słów kluczowych Ruby jako nazw zmiennych, więc nie będziesz mieć nazw zmiennych def lub module lub if lub enditp. - class nie jest inaczej.

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

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

Próba uruchomienia powoduje błąd, ponieważ nie można go użyć class jako nazwa 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 tego identyfikatora klass zamiast. Nie jest to wyjątkowe, ale jest tradycyjnie używane jako nazwa zmiennej, gdy masz do czynienia z nazwą klasy lub klasy. Jest fonetycznie taki sam, ale ponieważ nie jest zarezerwowanym słowem kluczowym, 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, jest

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

Można tam użyć dowolnej (niezarezerwowanej) nazwy zmiennej, ale społeczność skorzystała z tej możliwości klass. Nie ma żadnej specjalnej magii - to po prostu "Chciałem użyć nazwy" klasa "tutaj, ale nie mogę, ponieważ jest to zastrzeżone słowo kluczowe".

Na marginesie, ponieważ kilka razy wypisałeś błędnie, warto zauważyć, że w przypadku Rubiego sprawa ma znaczenie. Tokeny zaczynające się od dużej litery są stałymi. Za pośrednictwem Kilof:

Stała nazwa zaczyna się od dużej litery, po której następują znaki nazw. Nazwy klas i modułów są stałe i są zgodne ze stałymi konwencjami nazewnictwa. Zgodnie z konwencją zmienne stałe są zwykle pisane wielkimi literami i podkreśleniami w całym tekście.

Tak więc poprawna jest pisownia class i klassraczej niż Class i Klass. Te ostatnie byłyby stałe i jedno i drugie Class i Klass są poprawnymi stałymi nazwami, ale polecam, aby nie używać ich dla jasności.


158
2017-11-28 22:09



Cóż, nie tylko Class w szczególności ważna stała nazwa, jest również aktualna! (to klasa klasy) - Ashe
O rany, piękny. Całkowicie rozumiem teraz. Dzięki Chris! :) - thenengah
Myślę, że korzystanie z klass ponieważ lokalna zmienna pochodzi od Kilofa - użyli tej nazwy w kilku przykładach, z dokładnie opisanych tu powodów. - Ken Bloom
To musi stosować starą wersję ruby. Używając Ruby 1.9.3 object_instance.class.name == 'Object' - Augustin Riedinger
Nie, wciąż jest dokładne. Klasa Object.new jest Object, ale klasa Object to Class. - Chris Heald


klass jest również Railsiem (lub raczej ActiveRecord) metoda. Służy do uzyskania klasy stowarzyszenia.

Jak stwierdzono w powiązanych treściach:

class Author < ActiveRecord::Base
  has_many :books
end

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

14
2018-01-27 13:09





klass i clazz i clasz i tym podobne są twórcze błędy ortograficzne używane do obchodzenia zastrzeżonego słowa class.

Byłoby znacznie mniej rażące w użyciu class1 lub cl lub classX czy coś w tym rodzaju, a nie celową literówkę.


11
2018-04-28 21:02





Jeden to nazwa klasy, a drugi to domyślnie tylko niezdefiniowana stała. A dla pary, którą najprawdopodobniej zobaczysz, class i klassto pierwsze jest słowem kluczowym do definiowania klas, podczas gdy drugie jest tylko identyfikatorem (jak każdy inny ciąg znaków). Jest używany, gdy chcesz napisać słowo "klasa", ale nie może, ponieważ jest zarezerwowanym słowem kluczowym.


5
2017-11-28 21:57



Jaki jest sens, mam na myśli, dlaczego / jak go używać, do czego zwykle jest używany? - thenengah
Klasa @Sam jest zastrzeżonym słowem kluczowym do definiowania klas. Więc jeśli chcesz zająć się czymś z klasą ogólną (jak metaprogramowanie), nie możesz pisać class = Kernel.const_get(class_name). Ale możesz pisać klass = Kernel.const_get(class_name), i to jest używane do reprezentowania "klasy". - Thiago Silveira
Chodzi o to, że nie możesz użyć słowa kluczowego "klasa", aby oznaczać "klasę" ... ponieważ jest to słowo zarezerwowane (logika kołowa, ja wiem), więc słowo "klass" zostaje zastąpione. Jest to popularny język w wielu innych językach, np. Java i C #. - Scott
więc możesz dynamicznie przypisać klasę? Klass = object.class; Klass.new - coś takiego - thenengah
@Sam: Korzystanie Klass bo to byłby kiepski wybór, ponieważ identyfikatory zaczynające się od wielkich liter są stałe, więc można je ustawić tylko raz. Ale tak, to jest ogólny pomysł. - Chuck