1

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

b = a = sqrt(10);

在德尔福

b := a := Sqrt(10);

不被允许。

有了,三元运算符IfThen有一个“替代方案”,如Delphi - Equivalent to C#'s ternary operator? 总之,似乎不是绝对必要的。?: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)));

我并不是要“让一切看起来都像 C”。我刚刚注意到,有时在同一行中再次“重用”赋值的右侧会很好。(例如,请参阅Lazarus/Free Pascal:如何改进 while 循环的编码风格(以避免使用无限循环),其布尔表达式在每次传递时都被重新分配。)

4

2 回答 2

9

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


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

b = a = sqrt(10);

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

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

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

于 2016-06-21T05:48:37.087 回答
2

简短的回答是:
不。你想要什么是不可能的。并且可以说在 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,但它至少具有可读性/可维护性:

//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 程序员来说不必要地难以维护。

于 2016-06-21T15:31:24.187 回答