Переменная называется klass, а не class, потому что и if class = @handlers[server]
, и class.split("::")
вызовут синтаксическую ошибку, потому что, как вы сказали, class является ключевым словом в ruby.
Как правило, локальные переменные не могут быть названы как ключевые слова (методы хороши, но они могут вызываться только с явным получателем, поэтому вы не можете писать, например, class.name
вместо self.class.name
).
Каждый раз, когда анализатор видит токен class
в начале выражения, он интерпретирует его как ключевое слово.
Редактировать: Чтобы уточнить: Проблема не в том, что использование класса здесь будет неоднозначным, а в том, что вы просто не можете использовать ключевые слова в качестве имен локальных переменных. Парсер не распознает их как таковые.
Редактировать в ответ на второй комментарий: klass
используется здесь как локальная переменная, содержащая значение @handlers[server]
. Код также может быть написан без переменной (при условии, что значение @handlers[server]
не может измениться между двумя вызовами):
if @handlers[server]
obj = Object
@handlers[server].split("::").each { |x| obj = obj.const_get(x) }
Я предполагаю, что автор кода сохранил значение @handles[server]
в переменной для a) не нужно набирать @handlers[server]
дважды вместо одного раза, b) разъяснить читателю, что это значение является классом, и / или c) чтобы избежать необходимости звонить @handlers[]
дважды.
YAEdit: Надеемся, что для устранения последней путаницы следующий код также эквивалентен:
if foo = @handlers[server]
obj = Object
foo.split("::").each { |x| obj = obj.const_get(x) }
Или:
foo = @handlers[server]
if foo
obj = Object
foo.split("::").each { |x| obj = obj.const_get(x) }
Однако klass является более описательным именем переменной, чем foo, поэтому (предположительно) автор решил назвать переменную klass.