matches();
не буферизует, а find()
- буферы. find()
сначала выполняет поиск в конце строки, индексирует результат и возвращает логическое значение и соответствующий индекс.
Вот почему, когда у вас есть такой код, как
1:Pattern.compile("[a-z]");
2:Pattern.matcher("0a1b1c3d4");
3:int count = 0;
4:while(matcher.find()){
5:count++: }
В 4: механизм регулярных выражений с использованием структуры шаблонов будет читать весь ваш код (индекс для индексации, как указано regex[single character]
, чтобы найти хотя бы одно совпадение. Если такое совпадение найдено, оно будет проиндексировано, тогда цикл будет выполняться на основе индексированного результата else, если он не выполнил вычисления, как matches()
; Оператор while никогда не будет выполняться, так как первый символ совпадающей строки не является алфавитом.
Я не услышал о прямом эквиваленте также. Вы могли, вероятно, достигнуть того же эффекта с макросами, особенно на языке как Lisp, который имеет чрезвычайно мощные макросы.
Я не был бы вообще удивлен, если другие языки начинают включать что-то подобное, потому что это настолько мощно.
Ruby и C# оба легко позволяют Вам создать средства доступа путем определения метода считывания/методов установщика для атрибута, во многом как в Python. Однако это не разработано, чтобы естественно позволить Вам написать код для этих методов в другом классе способ, которым позволяет Python. На практике я не уверен, насколько это имеет значение, с тех пор каждый раз, когда я видел, атрибут, определенный через дескриптор, протоколирует свой, реализованный в том же классе.
Править: Чините мою дислексию (которым я имею в виду небрежное чтение). По некоторым причинам я всегда читал "дескриптор" как "декоратор" и наоборот, даже когда я - тот, вводящий их обоих. Я покину свой пост, неповрежденный, так как он имеет допустимую информацию, хотя информация, которая абсолютно не имеет никакого отношения к вопросу.
Термин сам "декоратор" является на самом деле названием шаблона разработки, описанного в известной книге "Шаблонов разработки". Статья Wikipedia содержит много примеров на различных языках программирования использования декоратора: http://en.wikipedia.org/wiki/Decorator_pattern
Однако декораторы в той объектно-ориентированной статье; у них есть классы, реализовывая предопределенный интерфейс, который позволяет другому существующему классу вести себя по-другому так или иначе, и т.д. декораторы Python действуют функциональным способом, заменяя функцию во времени выполнения с другой функцией, позволяя Вам эффективно изменить/заменить ту функцию, ввести код, и т.д.
Это известно в мире Java как Аспектно-ориентированное программирование, и компилятор AspectJ Java позволяет Вам сделать эти виды вещей и скомпилировать Ваш код AspectJ (который является надмножеством Java) в байт-код Java.
Я не достаточно знаком с C# или Ruby для знания, какова их версия декораторов была бы.