【发布时间】:2011-09-20 11:16:32
【问题描述】:
当一个表达式是一个返回某种值的函数时,有没有办法在一个临时变量中获取它的处理值,只能在匹配的表达式中访问?
让我们随便举个例子。
表达式中使用的函数:
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);
}
注意:$crazyTemporaryVariable 只是一个虚构变量。如果我忽略了它,我怀疑它是一个变量,认为它可能是一个处理时间常量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.
【问题讨论】:
-
而且看起来问题已经死了,所以答案被接受了。
标签: language-agnostic if-statement expression