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

标签 delphi pascal lazarus freepascal turbo-pascal

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

b = a = sqrt(10);


在德尔斐

b := a := Sqrt(10);


不被允许。

对于IfThenternary 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/

相关文章:

delphi - 相当于Delphi中的WebBrowser.Naviated事件?

delphi - 如何在 Delphi 中更改 TabControl 中事件 TAB 的颜色

delphi - 需要逆误差函数的代码

delphi-7 - 缺少@InitializeRecord

lazarus - 将变量添加到 StringGrid 中作为单元格数据?

mono - DLLImport 在 Mono (linux) : icall_wrapper_mono_marshal_free 中崩溃

delphi - Canvas 绘图 - 如何改进这个 Alpha 绘图例程?

delphi - 从字符串中删除所有非标准文本字符

c - 用于从堆栈中释放参数的函数和机器命令的激活记录

activex - Lazarus/FPC 中的接口(interface) : Multiple inheritance