функция в выражении, результат во временную переменную доступен только если выражение истинно - PullRequest
2 голосов
/ 20 сентября 2011

Если выражение является функцией, которая возвращает какое-то значение, есть ли способ получить обработанное значение во временной переменной , к которой можно получить доступ только в пределах соответствующего выражения?

Давайте сделаем случайный пример.

функция, используемая в выражениях:

function crazy($input){
    return $input * 5 - mt_rand(0, 5);
}

И как я вижу это должно работать:

if(crazy(2) > 5){
    $result = $crazyTemporaryVariable . ' crazies'; 
    // because calling crazy(2) here again will:
    // 1) process it again, 
    // 2) because of the `mt_rand();` return different value.
}else{
    $result = 'nothing can happen here, because $crazyTemporaryVariable is not set';
}

Другими словами, оно должно создавать временную переменную, если выражение истинно, иначе «ничего» не осталось.

Мне известно, что это можно сделать с помощью вызова функции перед выражением и присвоения ее возвращаемого значения ранее установленной переменной. Но вам нужно создать новую переменную - я вижу небольшое, но все же падение производительности, потому что, если выражение не соответствует требованиям - переменная бесполезна, но остается определенной.

// we have our crazy function above, a new expression

$crazy = crazy(2);
if($crazy > 5){
    $result = $crazy . ' crazies';
}else{
    $result = 'anything...';
}

// or...

$result = $crazy > 5 ? $crazy . ' crazies' : 'anything';

Примечание: это среда PHP, в которой я не видел ни такого поведения / возможности, ни на каком-либо другом языке, с которым я сталкивался (там не так много ').

Еще одна вещь, это хорошо относится и к циклам:

while(crazy(2) <= 5){
    $result = $crazyTemporaryVariable . ' crazies';
}

// where normally you'd have to change the variable value;
$crazy = crazy(2);
while($crazy <= 5){
    $result = $crazy . ' crazies';
    $crazy = crazy(2);
}

Примечание: $ crazyTeilitaryVariable - это просто мнимая переменная . И если я пропустил это, я сомневаюсь, что это переменная , думаю, что это может быть время обработки константа EXPRESSION_RESULT или что-то в этом роде. Но из-за моих английских ограничений я понятия не имею, что искать, чтобы найти его.

Так что да, ключ здесь определен, поэтому доступен, только если выражение истинно .

Итак, вопрос в том, существуют ли языки, которые поддерживают это , и если я пропустил это в PHP, как я могу получить к нему доступ, тогда + ссылка, пожалуйста?

После написания всего вышесказанного я вспомнил об этом поведении:

if(($crazy = crazy(2)) > 5){
    $result = $crazy . ' crazies';
}else{
    $result = $crazy . ' crazies, but... not crazy enough.';
}

Это почти то, что я ищу, но это почти то же самое, что и определение нашей переменной ранее, и вы можете получить доступ к результату функции, если выражение совпадает, следовательно, на этот раз оно не обрезается.

Заранее спасибо!

воображаемый пример

троичный и javascript ..

// could be: (keep in mind, this would not work with our _crazy_ function, because of random number.)
var result = string && string.search(/\s/) ? string.substr(0, __tempvar__) : string; // not available
// ...but instead is
var result = string.search(/\s/g) > 0 ? string.substring(0, string.search(/\s/g)) : string; // +1 repeated function call that affects performance.

1 Ответ

1 голос
/ 20 сентября 2011

Я вижу небольшое, но все же снижение производительности, потому что, если выражение не соответствует требованиям - переменная бесполезна, но остается определенной.

Имеет ли объявление переменной какую-либо разницу в производительности вообще зависит от языка и его реализации. Значение разницы в производительности зависит от приложения; вероятно, только если переменная ссылается на очень большой объект, который не уничтожен / GC'd, потому что у него все еще есть ссылка. Сами переменные должны быть практически свободны в любой полуприличной языковой реализации.

Другими словами, оно должно создавать временную переменную, если выражение истинно, иначе «ничего» не осталось.

Это усложняет правила определения содержания вашего языка. Что вы, возможно, захотите сделать на языке с C-подобными правилами области видимости:

# declare $result
{
    $crazy = crazy(2);
    if ($crazy > 5){
        $result = $crazy . ' crazies';
    } else {
        $result = 'anything...';
    }
    # end of scope for $crazy, so it disappears
    # and the object it refers to takes up no more space
}

Итак, вопрос в том, существуют ли языки, поддерживающие это

IIRC, Perl сохраняет значение последнего выражения (или что-то в этом роде) в $_. Я лично считаю это отвратительным. Короче говоря, вы действительно не должны этого хотеть; Существуют более простые и принципиальные способы решения этой проблемы.

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