例
此测试失败,因为each不修改列表的元素.
void test_each_DoesNotModifyListElements() {
List<String> list = ["a", "b", "c"]
list.each { it = it + "z" }
assert ["az", "bz", "cz"] == list
}
Run Code Online (Sandbox Code Playgroud)
此测试通过,因为collect返回包含已修改元素的新列表.
void test_collect_ReturnsNewListWithModifiedElements() {
List<String> list = ["a", "b", "c"]
list = list.collect{ it + "z" }
assert ["az", "bz", "cz"] == list
}
Run Code Online (Sandbox Code Playgroud)
假设
在这一点上,我假设each不修改列表的元素,因为我已经编写了下面的测试,我假设这是测试告诉我的.如果我错了,请纠正我.
void test_each_DoesNotModifyListElements1() {
List<String> list = ["a", "b", "c"]
list.each { it + "z" }
assert ["az", "bz", "cz"] == list
}
void test_each_DoesNotModifyListElements2() {
List<String> list = ["a", "b", "c"]
list.each { it = it + "z" }
assert ["az", "bz", "cz"] == list
}
void test_each_DoesNotModifyListElements3() {
List<String> list = ["a", "b", "c"]
list = list.each { it = it + "z" }
assert ["az", "bz", "cz"] == list
}
Run Code Online (Sandbox Code Playgroud)
题
所以问题是:作为一个Groovy初学者,我应该如何事先知道,在编写测试和谷歌搜索之前的意思,这each不会改变列表的元素?
通过阅读文档?
Groovy每个文档:迭代聚合类型或数据结构,将每个项目传递给给定的闭包.自定义类型可以通过简单地提供"iterator()"方法来利用此方法.从生成的迭代器返回的项将传递给闭包.
通常情况下,我最终会花费大量时间尝试解决问题并使用谷歌搜索答案.难道不应该有更有效的方法吗?在那儿?
嗯,这与Java/Groovy编程基础不远.有对象,有变量.变量可以保存对象的"链接",称为引用.所以基本上,使用变量可以访问存储在计算机内存深处的真实对象.
每当你改变变量(即,赋予它某些东西)时,你永远不会修改真实对象.相反,变量开始指向一些不同的Object.
现在,再次查看文档:
迭代聚合类型或数据结构,将每个项目传递给给定的闭包.
就是这样.它为您提供了指向每个项目的变量.如果覆盖已经给出的局部变量,变量将开始指向其他对象,就是这样.该列表仍然具有对旧对象的引用.
该信息是使用Java和类似语言编程所需的最基本的知识.通常在手册/文档的第一页解释.因为它是基本的,没有人会为你有某种参数的每个函数反复解释它.
| 归档时间: |
|
| 查看次数: |
3757 次 |
| 最近记录: |