【问题标题】:function in expression, result into temporary variable only accessible if the expression is true表达式中的函数,只有在表达式为真时才可访问临时变量
【发布时间】: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


【解决方案1】:

我看到一个小的,但仍然是性能下降,因为如果表达式不满足要求 - 变量是无用的,但保持定义。

声明变量是否会使任何性能差异完全取决于语言及其实现。性能差异是否重要取决于应用程序;可能只有当变量引用一个非常大的对象时,该对象才没有被销毁/GC,因为它仍然有一个引用。在任何半体面的语言实现中,变量本身实际上应该是免费的。

换句话说,如果表达式为真,它应该创建一个临时变量,否则,“什么都没有”被留下。

这使您的语言的范围规则非常复杂。您可能希望在具有类 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 将最后一个表达式(或类似的)的值存储在$_ 中。我个人觉得这很可怕。简而言之,你真的不应该这样;有更简单、更有原则的方法来处理这个问题。

【讨论】:

  • 嗯,变量只是一个示例目的。我想让它嵌套if-statementregex。比如,javascriptif(string.search(/\s/g) &gt; 0){ string.substr(0, __tempvar__); },否则我必须缓存它。希望我说清楚了。
  • 你可以使用全局变量来达到这个目的,尽管这很快就会变得很麻烦。我还是最喜欢 Python 的解决方案,即从 RE 匹配中返回一个 match 对象
  • 是的,全局变量确实很神奇,但正如您所说,会变得混乱。而这个temporary 只能在一个真实的语句中访问,就像有特定的三元运算符一样,if 语句可能有这个特定的变量。最终,人们发现所有使他们的代码“更短”的东西都有用处。是的,当涉及到对象和其他东西时,有点像... this/self 有一点不同的用途。 this 太棒了!
  • 是的,人们会发现它的用途。但是好的编程语言不是通过将功能堆叠在功能上,将异常堆叠在异常上来设计的。这使它们变得混乱、难以学习和难以实施。顺其自然,在条件之前设置临时变量。
  • 我见过的一些最好的编程语言,而且我见过将近两打,都是通过从以前的语言中去除特性而设计的。通常是因为这些功能被更好、更新的功能超越,但有时是因为它们只是杂乱无章。从最古老的编程语言开始,只有核心概念在现代语言中得以保留。
猜你喜欢
  • 1970-01-01
  • 2020-10-18
  • 2015-07-19
  • 2019-06-08
  • 2014-07-13
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多