Яка різниця між класом та класом у рубіні?


112

У чому різниця між класом і класом?


1
Де ви бачили останнього?
Дарин Димитров

18
klassзазвичай використовується для іменування змінної, яка містить Classоб'єкт (пам'ятайте, що класи теж є об'єктами), як у klass = String. Чи можете ви надати джерело того, де ви його бачили, для більш глибокого пояснення?
Чубас

5
Ні, я не хочу надати єдине джерело, тому що я не хочу, щоб це було пояснено так. Я хочу більше картини з цього
приводу

5
Іноді люди використовують, clazzа не klass(наприклад, у книзі «Метапрограмування Ruby»).
Ендрю Грімм

2
У TV Tropes це називалося б "Xtreme Kool Letterz" (жодна посилання - не безпечна для продуктивності).
Ендрю Грімм

Відповіді:


188

class- це ключове слово, яке використовується для визначення нового класу. Оскільки це зарезервоване ключове слово, ви не можете використовувати його як ім'я змінної. Ви не можете використовувати жодне з ключових слів Рубі як імен змінних, тому ви не зможете мати змінних з назвою defабо, moduleабо ifабо endтощо 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. У ньому немає особливої ​​магії - це просто означає "я хотів тут використовувати ім'я" клас ", але не можу, оскільки це зарезервоване ключове слово".

Зі сторони, оскільки ви кілька разів помилялися на помилках, варто зазначити, що в Рубі справа має значення. Маркери, які починаються з великої літери, є константами. Через Пікакс :

Постійне ім'я починається з великої літери, а потім символів імені. Назви класів та назви модулів є константами та дотримуються конвенцій постійного іменування. За умовою, постійні змінні зазвичай написані за допомогою великих літер та підкреслень.

Таким чином, правильним написанням є classі klass, а не Classі Klass. Останні були б константами, і обидва, Classі Klassє дійсними постійними іменами, але я б рекомендував не використовувати їх для наочності.


7
Ну, не тільки є Classдійсним постійним ім'ям, це ще й існуюче! (це клас Класу)
Ашера

1
Нічого собі, прекрасного. Повністю зрозуміти зараз. Дякую Кріс! :)
thenengah

1
Я думаю, що використання klassлокальної змінної походить від Pickaxe - вони використовували це ім'я в кількох прикладах саме з тих причин, які ви описали тут.
Кен Блум

Слід застосувати стару версію рубіну. З Ruby 1.9.3 я використовуюobject_instance.class.name == 'Object'
Августин Рідінгер,

Ні, це все одно точно. Клас Object.new - це Object, але клас Object - Class.
Кріс Хілд

22

klassтакож метод Rails (а точніше 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

Одне - це ім'я класу, а інше - лише невизначена константа за замовчуванням. І для пари, яку ви швидше бачите, classі klassперший є ключовим словом для визначення класів, а другий - лише ідентифікатор (як і будь-який інший рядок символів). Він використовується, коли ви хочете написати слово "клас", але не може, оскільки це зарезервоване ключове слово.


Який сенс, я маю на увазі, чому / як його використовувати, для чого він зазвичай використовується?
thenengah

3
Клас @Sam - це зарезервоване ключове слово для визначення класів. Тож якщо ви хочете мати щось із загальним класом (наприклад, метапрограмуванням), ви не можете писати class = Kernel.const_get(class_name). Але можна писати klass = Kernel.const_get(class_name), і це використовується для подання "класу".
Тіаго Сільвейра

2
Справа в тому, що ви не можете використовувати ключове слово 'class' для означати 'class' ... тому що це зарезервоване слово (кругова логіка, я знаю), тому замість нього замінено слово 'klass'. Це загальна ідіома для багатьох інших мов, наприклад, Java та C #.
Скотт

щоб ви могли динамічно призначити клас? Klass = object.class; Klass.new - щось подібне
thenengah

3
@Sam: Використання Klassдля цього було б поганим вибором, оскільки ідентифікатори, що починаються з великих літер, є константами, тому ви могли встановити його лише один раз. Але так, це загальна ідея.
Чак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.