是否可以将语句转换为表达式?

Is it possible to turn a statement into a expression?

在 C 中,您可以在一行中分配两个变量

b = a = sqrt(10);

在Delphi

b := a := Sqrt(10);

不允许。

有了IfThenternary operator ?: as discussed in Delphi - Equivalent to C#'s ternary operator?就有了"alternative" 综上所述,IfThen似乎绝对必要的。

所以也许还有这样的事情:

function AssignAndReturn(var LHS: Integer; RHS: Integer): Integer;
begin
  LHS := RHS;
  Result := RHS;
end;

(...)

var
  a, b: Integer;
begin
  b := AssignAndReturn(a, Round(Sqrt(10)));

我不想 "make everything look like C"。我刚刚注意到,有时在同一行中再次 "reuse" 赋值的右侧会很好。 (例如,参见 。)

赋值语句不是表达式。它不会,也永远不会产生价值。在一个语句中分配给多个变量的唯一方法是通过函数。


基于这个问题和你之前的问题,我想说你在试图反对语言方面是错误的。编码成您正在使用的语言。在 C 中你可以这样写

b = a = sqrt(10);

但是在 Pascal 中,语言希望你这样写

a := sqrt(10);
b := a;

这样做。不要仅仅为了将其全部塞进一行就创建晦涩的函数。上面的两行再清楚不过了。停止尝试将其他语言强制转换为 Pascal。他们不适合。

简短的回答是:
不,你想要的是不可能的。并且可以说在 Delphi.

中几乎没有任何好处

首先,让我们讨论一个更实际的例子。坦率地说,a = b = f(x); 是一个相当糟糕的例子。

  • 很少有人会随意将相同的值分配给 2 个变量。
  • 上面的操作顺序必须打破从左到右的约定,否则它会先解析 a = b 然后 ? = f(x)
  • 所以没有理由支持 b = f(x); a = b;
  • 基本上它有利于字节数(代码高尔夫)而不是可读性。

因此,让我们考虑以下更实际的场景:

//Option 1
if ((b = f(x)) > 42)
  //use b

上面没有Delphi,但至少readable/maintainable写成:

//Option 2
b := f(x);
if (b > 42) then
  //use b

还有一个选项可以考虑;特别是如果选项 1 位于较大函数的中间。 请记住,小函数更易于维护,也更易于编译器优化。所以考虑:

//Option 3
...
ProcessRule42(f(x));
...
//Where Rule42 is is implemented as:
procedure ProcessRule42(b: Integer);
begin
  if (b > 42) then
    //use b
end;

Delphi 似乎并没有因为不能写而痛苦: if (b := f(x)) > 42 then //use b.

选项 1 有任何实际好处吗?

如果选项 2 至少同样好,为什么还要考虑选项 1。当您考虑范围规则时,好处就会显现出来。

//b does not exist
if ((var b = f(x)) > 42) {
  //use b
}
//b does not exist 

// Using the Delphi approach, this becomes:
//b does not exist
var b = f(x);
if (b > 42) {
  //use b
}
//b still exists

Delphi 根本没有相同的范围问题。 Delphi 变量都是在方法的开头声明的,整个方法都可以使用。


结论

这让我们回到其他人一直试图解释的问题上。 Delphi 是一种不同的语言,对某些问题的处理方法略有不同。虽然我赞赏您检查其他选项并考虑可以从其他语言借用哪些概念:但要小心尝试将某些概念强行放入不属于它们的地方。

如果您打破太多 Delphi 范式,您的代码对于 Delphi 程序员来说可能变得不必要的困难维护。