【发布时间】:2021-01-21 13:34:27
【问题描述】:
我正在实现我自己的编程语言,并为选择什么 for 循环语法感到困惑。
似乎所有最新最酷的语言都在使用基于范围的 for 循环。为了了解它的优缺点,我用谷歌搜索,唯一的答案似乎是cleaner and cooler。
虽然我可以顺势而为。我无法说服自己它比 c 风格的 for 循环更好。
我认为支持 for(:)、foreach、for ... in... 之类的快捷方式很棒,但不应该支持旧的 c 样式 for 循环作为通用后备吗?
for(int i =0;i<len;++i) {}
因为它非常灵活,可以轻松处理所有可能的情况。对我来说,这是“少即是多”的一个例子。
有了它,我不需要像这样搜索答案:
using range based for loop for iterating on a sub range
https://www.dotnetperls.com/range-swift
Skip 1st Iteration of Range-Based For Loops
我只需要记住一种语法就可以实现一切。例如,下面的 sn -p 实现了一个运行长度编码算法。您可以在子 while 循环中更新 for 循环的索引。你不需要不断地进步。您不必预先定义循环行为。
// CPP program to implement run length encoding
#include <bits/stdc++.h>
using namespace std;
void printRLE(string str)
{
int n = str.length();
for (int i = 0; i < n; i++) {
// Count occurrences of current character
int count = 1;
while (i < n - 1 && str[i] == str[i + 1]) {
count++;
i++;
}
// Print character and its count
cout << str[i] << count;
}
}
int main()
{
string str = "wwwwaaadexxxxxxywww";
printRLE(str);
return 0;
}
基于范围的循环主要是为了语言人体工程学吗?
但是这些不丑吗?你最终会输入更多内容来达到同样的效果。
for i in stride(from:5,through:1,by:-1) { print(i) } // 5 4 3 2 1
for (n, prime) in primes.enumerated() {}
编辑: 写完第一个问题,我隐隐约约记得swift好像一开始就支持c风格的for循环,后来去掉了。在谷歌上搜索了这段历史之后,我找到了https://github.com/apple/swift-evolution/blob/master/proposals/0007-remove-c-style-for-loops.md,这背后有一些原因。我不认为“不太像 Swift”。虽然很合乎逻辑......
【问题讨论】:
-
stride(from: 5,through: 1,by: -1)在这种情况下,您实际上不需要使用stride。我会选择for i in (1...5).reversed(),我认为它远更好。我认为你遗漏了一些东西:基于范围的循环只是一个特例。一般来说,所有的 Swift 循环只适用于Sequence,任何Sequence。这就是使它们如此出色的原因,循环的序列不仅仅是一种语言结构,它是可以传递的一等公民。您可以map、filter或reduce和(1...5).reversed()。你不能对(int i = 5; i > 0; i--)这样做,因为它不是“东西”
标签: swift programming-languages language-design range-based-loop