Это пытается ввести некоторое Совершенство Ruby:)
Понятие: Это - некоторый демонстрационный код Ruby, который распечатывает каждый элемент массива
rubyArray = [1,2,3,4,5,6,7,8,9,10]
rubyArray.each{|x|
puts x # do whatever with x
}
каждая реализация метода Массива урожаи управление вызывающей стороне ('помещает x') с каждый элемент массива, аккуратно представленного как x. Вызывающая сторона может тогда сделать то, что это должно сделать с x.
Однако .Net не идет полностью сюда.. C#, кажется, связал урожай с IEnumerable, способом вынуждая Вас записать цикл foreach в вызывающей стороне, как замечено в ответе Mendelt. Немного менее изящный.
//calling code
foreach(int i in obCustomClass.Each())
{
Console.WriteLine(i.ToString());
}
// CustomClass implementation
private int[] data = {1,2,3,4,5,6,7,8,9,10};
public IEnumerable<int> Each()
{
for(int iLooper=0; iLooper<data.Length; ++iLooper)
yield return data[iLooper];
}
Жадный оператор всегда пытается «схватить» как можно больше входных данных, в то время как неохотный квантификатор будет соответствовать как можно меньшему количеству входных данных и все равно создавать совпадение.
Пример :
"The red fox jumped over the red fence"
/(.*)red/ => \1 = "The red fox jumped over the "
/(.*?)red/ => \1 = "The "
"aaa"
/a?a*/ => \1 = "a", \2 = "aa"
/a??a*/ => \1 = "", \2 = "aaa"
"Mr. Doe, John"
/^(?:Mrs?.)?.*\b(.*)$/ => \1 = "John"
/^(?:Mrs?.)?.*?\b(.*)$/ => \1 = "Doe, John"
Из по этой ссылке , где автор руководства признает суть вашего вопроса:
На первый взгляд может показаться, что кванторы X ?, X ?? и X? + делать в точности то же самое, так как все они обещание сопоставить "X, один раз или нет в все ». Есть тонкая реализация различия, которые будут объяснены ближе к концу этого раздела.
Далее они собирают примеры и предлагают объяснение:
Жадные кванторы считаются «жадные», потому что они заставляют сопоставитель, чтобы прочитать или съесть весь входная строка перед попыткой первый матч. Если первое совпадение попытка (вся входная строка) сбой, сопоставитель отключает ввод строка по одному символу и пытается снова, повторяя процесс до тех пор, пока совпадение найдено или больше нет символов осталось отступить от. В зависимости от квантификатора, используемого в выражение, последнее, что это будет попробуйте сопоставить с 1 или 0
Однако неохотные кванторы используйте противоположный подход: они начинают в начале входной строки, затем неохотно съесть одного персонажа в время искать совпадение. Последний то, что они пробуют, - это весь ввод строка.
И для дополнительной похвалы, притяжательное объяснение:
Наконец, притяжательные кванторы всегда есть всю строку ввода, пытаясь один раз (и только один раз) для соответствие. В отличие от жадных квантификаторов, притяжательные кванторы никогда не отступают, даже если это позволит полное совпадение для успеха.
Жадный квантификатор будет соответствовать как можно большему количеству, но все равно будет соответствовать Неохотный квантификатор будет соответствовать наименьшему возможному количеству.
например, учитывая строку
abcdef
, жадный квалификатор
ab [az] * [az] будет соответствовать abcdef
сопротивляющемуся квалификатору
] ab [az] *? [az] будет соответствовать abc
say you have a regex "a\w*b"
, and use it on "abab"
Greedy matching will match "abab"
(it looks for an a
, as much occurrences of \w
as possible, and a b
) and reluctant matching will match just "ab"
(as little \w
as possible)
Имеется документация о том, как Perl обрабатывает эти квантификаторы perldoc perlre
.
По умолчанию квантифицированный подшаблон является «жадным», то есть он будет соответствовать как можно большему количеству раз, насколько это возможно (учитывая конкретное начальное местоположение), при этом позволяя остальной части шаблона совпадать. Если вы хотите, чтобы оно совпадало минимально возможное количество раз, введите после квантификатора «?
». Обратите внимание, что значения не меняются, только «жадность»:По умолчанию, когда количественно определенный подшаблон не позволяет сопоставить остальную часть общего шаблона, Perl выполняет возврат. Однако такое поведение иногда нежелательно. Таким образом, Perl также предоставляет «притяжательную» форму квантора.
*? Совпадение 0 или более раз, не жадно +? Совпадение 1 или более раз, не жадно ?? Матч 0 или 1 раз, не жадно {n}? Совпадение ровно n раз, не жадно {n,}? Матч не менее n раз, не жадно {п, м}? Совпадение не менее n, но не более m раз, не жадноНапример,
* + 0 или более совпадений и ничего не возвращать ++ Совпадение 1 или более раз и ничего не вернуть ? + Сопоставьте 0 или 1 раз и ничего не верните {n} + совпадение ровно n раз и ничего не вернуть (избыточно) {n,} + сопоставить не менее n раз и ничего не вернуть {n, m} + найти не менее n, но не более m раз и ничего не вернутьникогда не будет соответствовать, так как
'aaaa' = ~ / a ++ a /a ++
поглотит всеa
в строке и не оставит ничего для оставшейся части шаблона. Эта функция может быть чрезвычайно полезной для подсказок Perl о том, где не следует возвращаться. Например, типичная задача «сопоставить строку в двойных кавычках» может быть наиболее эффективно решена, если записать ее как:как мы знаем, если окончательная цитата не совпадает, возврат с возвратом не поможет. Подробнее см. Независимое подвыражение
/ "(?: [^" \\] ++ | \\.) * + "/(?> ...)
; притяжательные квантификаторы - это просто синтаксический сахар для этой конструкции. Например, приведенный выше пример можно также записать следующим образом:
/ "(?> (?: (?> [^" \\] +) | \\.) *) »/