www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Foreach, return not exist the function.

reply "Zaher Dirkey" <zaherdirkey yahoo.com> writes:
First time i used foreach with opApply in my classed, and i got 
this strange behavior.

return e, not exit the function "findClass"
i tried to reproduce it, but it is worked in reproduce example.
but you can read it and read the result of writeln.
I still feel it is my eyes or a small mistake.

---------------------
SrdController findClass(const ClassInfo controllerClass)
{
	foreach(e; this) {
		if (e.classinfo.name == controllerClass.name) {
			writeln("we found " ~ e.classinfo.name);
			return e;
		}
	}
	writeln("not found ");
	return null;
}

results
------------------

sard.parsers.SrdControllers.add(sard.parsers.SrdControllerNormal)
sard.parsers.SrdControllers.add(sard.parsers.SrdControllerDefines)
we found sard.parsers.SrdControllerNormal
not found

reproduce example here
http://dpaste.dzfl.pl/13fb453d0b1e


it is part for opensource code here
https://github.com/parmaja/sard/blob/master/src/sard/parsers.d#L222
Jan 11 2015
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 01/11/2015 12:25 PM, Zaher Dirkey wrote:

 reproduce example here
 http://dpaste.dzfl.pl/13fb453d0b1e
That link doesn't work for me. (?) Does opApply return the delegate's return value ('b' below)? import std.stdio; struct S { int opApply(int delegate(int) dg) { foreach (i; 0 .. 10) { int b = dg(i); if (b) { writefln("Exiting opApply with %s", b); return b; } } return 0; } } int foo() { auto s = S(); foreach (i; s) { writeln(i); return 42; } return 0; } void main() { assert(foo() == 42); } Ali
Jan 11 2015
next sibling parent "Zaher Dirkey" <zaherdirkey yahoo.com> writes:
On Sunday, 11 January 2015 at 23:50:18 UTC, Ali Çehreli wrote:
 On 01/11/2015 12:25 PM, Zaher Dirkey wrote:

 reproduce example here
 http://dpaste.dzfl.pl/13fb453d0b1e
That link doesn't work for me. (?) Does opApply return the delegate's return value ('b' below)?
It must return object, but it is in template i added ref, or witout ref, same this the part of opApply int opApply(int delegate(ref T) callback) { int result = 0; for (int i = 0; i < _items.length; ++i) { result = callback(_items[i]); if (result == 0) break; } return result; } this part code here https://github.com/parmaja/sard/blob/master/src/sard/classes.d and reproduced (but works fine) here https://github.com/zaher/d_test/blob/master/foreach.d
Jan 11 2015
prev sibling parent "Zaher Dirkey" <zaherdirkey yahoo.com> writes:
On Sunday, 11 January 2015 at 23:50:18 UTC, Ali Çehreli wrote:
 On 01/11/2015 12:25 PM, Zaher Dirkey wrote:

 reproduce example here
 http://dpaste.dzfl.pl/13fb453d0b1e
That link doesn't work for me. (?) Does opApply return the delegate's return value ('b' below)? import std.stdio; struct S { int opApply(int delegate(int) dg) { foreach (i; 0 .. 10) { int b = dg(i); if (b) { writefln("Exiting opApply with %s", b); return b; } } return 0; } } int foo() { auto s = S(); foreach (i; s) { writeln(i); return 42; } return 0; } void main() { assert(foo() == 42); } Ali
It in breaking the loop in opApply if (result==0) { must be if (result) { Thanks to Ali, and Zor at #D (freenode)
Jan 12 2015