简单的答案,不,D 没有生成器或列表推导(AFAIK)。但是,您可以使用 InputRange 创建生成器。对于该解决方案,请参阅此相关问题:D 编程语言中的“收益回报”等价物是什么?
但是,您的代码没有使用生成器,因此您的代码可以翻译为:
import std.algorithm : max, reduce, retro, equal;
import std.conv : to;
immutable N = 13;
void main() {
int[] keep;
foreach(x; 0 .. N) {
foreach(y; x .. N) {
auto val = x*y;
auto s = to!string(val);
if (equal(s, s.retro)) // reverse doesn't work on immutable Ranges
keep ~= val; // don't use ~ if N gets large, use appender instead
}
}
reduce!max(keep); // returns 121 (11*11)
}
对我来说,这比您的列表理解更具可读性,因为列表理解已经变得非常大。
那里可能有更好的解决方案,但这就是我实施它的方式。额外的好处是您可以看到 std.algorithm 的所有荣耀。
但是,对于这段特定的代码,我不会使用数组来节省内存,而是只存储最佳值以节省内存。像这样的东西:
import std.algorithm : retro, equal;
import std.conv : to;
immutable N = 13;
void main() {
int best = 0;
foreach(x; 0 .. N) {
foreach(y; x .. N) {
auto val = x*y;
auto s = to!string(val);
if (equal(s, s.retro))
best = val;
}
}
}