在C语言中,您可以在一行中分配两个变量
b = a = sqrt(10);
在德尔斐
b := a := Sqrt(10);
不被允许。
对于
IfThen
,ternary operator ?:
中讨论的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: How to improve coding style (to avoid using endless loop) of a while loop whose boolean expression is reassigned every pass。)
最佳答案
简短的答案是:
不,您想要的是不可能的。可以说,在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程序员可能不必要地难以维护您的代码。
关于delphi - 是否可以将语句转换为表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37932462/