Как «Использовать» работает в Groovy? - PullRequest
2 голосов
/ 26 марта 2011

Привет, у меня есть следующий фрагмент кода;

class StringCalci
{
        static def plus(Integer self, Integer Operand)
        {
                return self.toInteger() * Operand.toInteger()
        }
}
use (StringCalci)
{
        println("inside the Use method!")
        println( 12 + 3 )
}
println(12+3)

Я был шокирован, увидев использование Use в Groovy.Дело в том, что я могу добавлять методы к классу во время выполнения (мои собственные методы). Когда я смотрел на приведенный выше код, я думал, как Groovy делает такие вещи возможными!Использование println внутри Use умножает два заданных числа (потому что у меня есть метод Override plus), где как внешнее println добавляет его!Мой вопрос заключается в том, как Groovy распознает, что println выполняется в Use и println вне Use.Является ли Use ключевым словом / методом?Мне нужно разобраться за кулисами этого процесса .. Пожалуйста, дайте мне знать :) Заранее спасибо:)

1 Ответ

5 голосов
/ 26 марта 2011

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

Эта функция называется Категории .Что касается реализации:

  • use на самом деле не ключевое слово, а метод, который среда исполнения Groovy добавляет к Object классу , что делает его доступным везде.
  • Я думаю, что функциональность реализована в основном в классе GroovyCategorySupport
  • Судя по Javadoc, он основан на хранении карты переопределенных методов в ThreadLocal, которыйзатем консультировались по каждому вызову метода.
  • да, это не так хорошо для производительности, но почти все динамические «волшебные» функции, которые предлагает Groovy и подобные языки (и их много).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...