写点什么

各编程语言里对 Iterator 进行修改时的对比

用户头像
BlockQuant
关注
发布于: 4 小时前
func main() {    data := []int{1, 2, 3, 4, 5}    fmt.Println("before:", data)    for _, v := range data {        data = append(data, v)    }    fmt.Println("after :", data)}
复制代码

go for range 类似语法糖,编译时候会转化为正常的 for 条件循环,类似下面的代码:

//before [1 2 3 4 5]//after  [1 2 3 4 5 1 2 3 4 5]
n := len(data)for i:=0; i< n; i++ { data = append(data)}
复制代码


#!/usr/bin/pythonif __name__ == "__main__":    data = [1, 2, 3, 4, 5]    print("before:", data)
for x in data : data.append(x)
print("after :", data)
复制代码

Python list for 会调用 iter(data) 转化为一个 Iterator, 然后调用 list c 实现的 listiter_next 方法,里面只判断了当前 index < PyList_GET_SIZE(seq) 就可以了。所以会一直循环下去。

import java.util.Iterator;import java.util.List;
public class Solution2 { public static void main(String[] args) { ArrayList<Integer> data = new ArrayList<Integer>(); data.add(1); data.add(2); data.add(3); data.add(4); data.add(5);
System.out.println(data); for (Integer num: data) { data.add(num); } System.out.println(data);
}}
复制代码

ArrayList 父类 AbstractList 里的内部类 Itr 的 next 方法会检查 它的 modCount 是否修改,修改了就产生异常。


fn main() {    let mut data = vec![1, 2, 3];    println!("{:?}", data);    for x in data {        data.push(x)    }    println!("{:?}", data);}
复制代码

Rust 这个可以理解为一个 RWLock, for in 这里是读,下边 push 是写。在 safe Rust 下 编译期就会报错。

发布于: 4 小时前阅读数: 4
用户头像

BlockQuant

关注

还未添加个人签名 2018.06.13 加入

还未添加个人简介

评论

发布
暂无评论
各编程语言里对 Iterator 进行修改时的对比