是否可以将语句转换为表达式?
Is it possible to turn a statement into a expression?
在 C 中,您可以在一行中分配两个变量
b = a = sqrt(10);
在Delphi
b := a := Sqrt(10);
不允许。
有了IfThen
,ternary 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 程序员来说可能变得不必要的困难维护。
在 C 中,您可以在一行中分配两个变量
b = a = sqrt(10);
在Delphi
b := a := Sqrt(10);
不允许。
有了IfThen
,ternary 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 程序员来说可能变得不必要的困难维护。