我只是写了一些快速代码并注意到这个编译器错误
在lambda表达式中使用迭代变量可能会产生意外结果.
相反,在循环中创建一个局部变量并为其分配迭代变量的值.
我知道这意味着什么,我可以很容易地解决它,而不是什么大不了的事.
但我想知道为什么在lambda中使用迭代变量是个坏主意?
我以后可能会遇到什么问题?
我只是对此感到好奇:以下代码无法编译,因为我们无法修改foreach迭代变量:
foreach (var item in MyObjectList)
{
item = Value;
}
Run Code Online (Sandbox Code Playgroud)
但是以下将编译并运行:
foreach (var item in MyObjectList)
{
item.Value = Value;
}
Run Code Online (Sandbox Code Playgroud)
为什么第一个无效,而第二个可以在下面做同样的事情(我正在为此寻找正确的英语表达,但我不记得了.在...下面??^^)
我正在尝试遍历嵌套对象以检索由字符串标识的特定对象.在下面的示例对象中,标识符字符串是"label"属性.我无法绕过如何遍历树以返回适当的对象.任何帮助或建议将不胜感激.
var cars = {
label: 'Autos',
subs: [
{
label: 'SUVs',
subs: []
},
{
label: 'Trucks',
subs: [
{
label: '2 Wheel Drive',
subs: []
},
{
label: '4 Wheel Drive',
subs: [
{
label: 'Ford',
subs: []
},
{
label: 'Chevrolet',
subs: []
}
]
}
]
},
{
label: 'Sedan',
subs: []
}
]
}
Run Code Online (Sandbox Code Playgroud) 我想迭代两个不同的迭代器,如下所示:
file1 = open('file1', 'r')
file2 = open('file2', 'r')
for item in one_then_another(file1, file2):
print item
Run Code Online (Sandbox Code Playgroud)
我希望打印file1的所有行,然后是file2的所有行.
我想要通用的东西,因为迭代器可能不是文件,这只是一个例子.我知道我可以这样做:
for item in [file1]+[file2]:
Run Code Online (Sandbox Code Playgroud)
但这会将两个文件都读入内存,我宁愿避免使用.
现在我正在尝试这个:
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s %s sourcecode input", argv[0], argv[1]);
}
else {
char source[] = "This is an example.";
int i;
for (i = 0; i < sizeof(source); i++) {
printf("%c", source[i]);
}
}
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这也不起作用:
char *source = "This is an example.";
int i;
for (i = 0; i < strlen(source); i++){
printf("%c", source[i]);
}
Run Code Online (Sandbox Code Playgroud)
我收到了错误
Test.exe中0x5bf714cf(msvcr100d.dll)的未处理异常:0xC0000005:读取位置0x00000054时发生访问冲突.
(从德语松散翻译)
那我的代码出了什么问题?
在Python上,range(3)将返回[0,1,2].是否存在多维范围的等价物?
range((3,2)) # [(0,0),(0,1),(1,0),(1,1),(2,0),(2,1)]
Run Code Online (Sandbox Code Playgroud)
因此,例如,循环通过基于图块的游戏上的矩形区域的图块可以写为:
for x,y in range((3,2)):
Run Code Online (Sandbox Code Playgroud)
注意我不是要求实现.我想知道这是否是一个公认的模式,如果在Python或它的标准/公共库上有内置函数.
for (var k in dictionary)
{
var key:KeyType = KeyType(k);
var value:ValType = ValType(dictionary[k]); // <-- lookup
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这是我用来遍历字典中的条目.正如您在每次迭代中看到的那样,我在字典中执行查找.是否有更有效的方法来迭代字典(同时保持对密钥的访问)?
问题发生在
Element element = it.next();
Run Code Online (Sandbox Code Playgroud)
并且包含该行的代码位于 OnTouchEvent
for (Iterator<Element> it = mElements.iterator(); it.hasNext();){
Element element = it.next();
if(touchX > element.mX && touchX < element.mX + element.mBitmap.getWidth() && touchY > element.mY
&& touchY < element.mY + element.mBitmap.getHeight()) {
//irrelevant stuff..
if(element.cFlag){
mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY));
element.cFlag = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
所有这一切都在里面synchronized(mElements),这里mElements是一个ArrayList<Element>
当我触摸它时Element,它可能会激活cFlag,这将创建另一个Element具有不同属性的属性,这些属性将从屏幕上掉落并在不到一秒的时间内自行消失.这是我创建粒子效果的方式.我们可以称之为"粒子" crack,就像构造函数中的String参数一样.
这一切都正常,直到我添加另一个主要Element.现在我同时Elements在屏幕上有两个,如果我触摸最新的Element,它工作正常,并启动粒子.
但是,如果我触摸并激活cFlag旧版本Element,那么它会给我一个例外.
07-28 15:36:59.815: ERROR/AndroidRuntime(4026): FATAL …Run Code Online (Sandbox Code Playgroud) 如果没有,是否有一个好的计数器示例显示迭代算法,其中不存在递归对应物?
如果所有迭代算法都可以递归表达,那么在哪些情况下更难以做到这一点?
此外,编程语言在这一切中扮演什么角色?我可以想象,Scheme程序员对Java迭代(=尾递归)和堆栈使用的看法与Java专用程序员不同.
举个例子:
假设我有班级电话Gun.我有另一个班级电话Bullet.
Class Gun有一个ArrayList Bullet.
迭代通过Arraylist ...而Gun不是这样做:
ArrayList<Gun> gunList = new ArrayList<Gun>();
for (int x=0; x<gunList.size(); x++)
System.out.println(gunList.get(x));
Run Code Online (Sandbox Code Playgroud)
我们可以简单地遍历ArrayList Gun:
for (Gun g: gunList) System.out.println(g);
Run Code Online (Sandbox Code Playgroud)
现在,我想迭代并打印出Bullet我的第三个Gun对象:
for (int x=0; x<gunList.get(2).getBullet().size(); x++) //getBullet is just an accessor method to return the arrayList of Bullet
System.out.println(gunList.get(2).getBullet().get(x));
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:如何使用ArrayList迭代打印输出枪对象列表,而不是使用传统的for-loop?