Как класс может иметь метод с именем end - PullRequest
0 голосов
/ 15 января 2019

В Sketchup Ruby класс Edge имеет метод с именем " end ".

Как Ruby работает с этим именем метода, чтобы не конфликтовать с защищеннымКлючевое слово, помечающее блокировку (например, if … end)?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Как Ruby работает с именем этого метода, чтобы не конфликтовать с защищенным ключевым словом

Легко: они не являются защищенными ключевыми словами. Они задокументированы как ключевые слова, но на самом деле, в синтаксическом анализаторе, они не совсем. Они больше похожи на то, что C♯ называет «контекстными ключевыми словами», то есть они обрабатываются только специально в определенном контексте.

0 голосов
/ 15 января 2019

Как Ruby работает с именем этого метода, чтобы не конфликтовать с защищенное ключевое слово, помечающее блокировку (например, если… конец)?

При использовании def синтаксический анализатор предполагает, что ниже следует идентификатор (символ сортов), разделенный паренсом или пробелом. Вы не можете динамически назначать имена методов с помощью def (без использования какой-либо формы eval).

define_method(:end){} принимает символ (или строку), поэтому здесь нет проблем с использованием зарезервированного слова.

Но методы нельзя вызывать с неявным получателем, как это обычно делается внутри класса:

# ok
class Foo
  def end
  end

  def test
    # not ambiguous 
    self.end 
  end
end

# syntax error, unexpected keyword_end, expecting end-of-input
class Bar
  def end
  end

  def test
    end 
  end
end

Вы можете вызвать метод с явным получателем:

Foo.new.end

Или используйте динамический вызов с send или call.

class Foo
  def end
  end

  def test
    send(:end)
    method(:end).call
  end
end

Вы также можете использовать ключевые слова в именах переменных (@end), class (@@ end) и глобальных ($ end), поскольку сигил сообщает парсеру, что мы имеем дело с переменной, но не для локальных переменных, которые имеют без сигил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...