Да, лямбда будет создавать мусор, если замыкание захватывает переменную из локальной области (т. Е. gameTime
в этом контексте).
Например, следующая функция C #:
static void TestLambda(List<Foo> Foos, DateTime gameTime)
{
Foos.ForEach(f => f.Update(gameTime));
}
будет переведена на это:
private static void TestLambda(List<Foo> Foos, DateTime gameTime)
{
Program.<>c__DisplayClass1 <>c__DisplayClass = new Program.<>c__DisplayClass1();
<>c__DisplayClass.gameTime = gameTime;
Foos.ForEach(new Action<Foo>(<>c__DisplayClass.<TestLambda>b__0));
}
Обратите внимание, что есть два экземпляра из new
в результирующем коде, что означает, что выделяются не только Action
объекты (замыкания), но и объекты для хранения захваченных переменных (экранирование записей переменных).
У вас есть несколько вариантов в зависимости от ваших потребностей. В этом простом примере strpos ()
, вероятно, является самой простой и удобной функцией. Если вам нужно что-то сделать с результатом, вы можете предпочесть strstr ()
или preg_match ()
. Если вам нужно использовать сложный узор вместо строки в качестве иглы, вам понадобится preg_match ()
.
$needle = "to";
$haystack = "I go to school";
strpos () и метод stripos () (stripos () - регистр нечувствительный):
if (strpos($haystack, $needle) !== false) echo "Found!";
метод strstr () и stristr () (stristr нечувствителен к регистру):
if (strstr($haystack, $needle)) echo "Found!";
метод preg_match (регулярные выражения, гораздо более гибкие, но работают медленнее):
if (preg_match("/to/", $haystack)) echo "Found!";
Потому что вы спросили для полной функции, вот как вы бы сложили это вместе (со значениями по умолчанию для иглы и стога сена):
function match_my_string($needle = 'to', $haystack = 'I go to school') {
if (strpos($haystack, $needle) !== false) return true;
else return false;
}
function hasWord($word, $txt) {
$patt = "/(?:^|[^a-zA-Z])" . preg_quote($word, '/') . "(?:$|[^a-zA-Z])/i";
return preg_match($patt, $txt);
}
Если $ word равно "до", это будет соответствовать:
но не:
используйте:
return (strpos($text,$word) !== false); //case-sensitive
или
return (stripos($text,$word) !== false); //case-insensitive
<?php
$text = "I go to school";
$word = "to"
$pos = strpos($text, $word);
if ($pos === false) {
return false;
} else {
return true;
}
?>
$text="I go to school";
return (strpos($text, 'to')!== false);
На странице руководства, которая вам нужна, чтобы найти правильное использование strpos
Другой способ (помимо уже приведенных примеров strpos - использовать функцию 'strstr':
if (strstr($haystack, $needle)) {
return true;
} else {
return false;
}