inout in opAssert in custom range

monkyyy crazymonkyyy at gmail.com
Sun Aug 30 08:35:22 UTC 2026


On Sunday, 30 August 2026 at 03:28:49 UTC, Valentino Giudice 
wrote:
> 
> int opApply(scope int delegate(MyClass item) dg)

> int opApply(scope int delegate(const MyClass item) dg) const

I dont think this does what you think it does; I dont use 
keywords that can only make less code work but im pretty sure 
that const does nothing, the way youve written it is confusing 
yourself, its applied to the int and futhermore opApplies return 
is a return code for asm gotos

```d
import std;
struct bar{
	const int i;
	int j;
	const int front()=>i+j;
	void popFront(){j++;}
	bool empty()=>j>10;
}
unittest{
	foreach(const i;bar(2)){
		typeof(i).stringof.writeln;
	}
	foreach(i;bar(4)){
		typeof(i).stringof.writeln;
	}
}
```

the constness of foreach varibles is part of a constructed for 
loop; d avoid bidirectional type propganging like c++ or haskell 
(because those languages are slow and buggy when you use it)

---

```d
import std;
class MyClass{}
struct bar{
	int opApply(scope int delegate(MyClass item) dg)
	{
	for (size_t i = 0; i < 2; i++)
	{
		int result = dg(new MyClass());
		if (result != 0)
		{
			return result;
		}
	}
	return 0;
	}
}
unittest{
	foreach(const i;bar()){
		typeof(i).stringof.writeln;
	}
	foreach(i;bar()){
		typeof(i).stringof.writeln;
	}
}
```

```
const(MyClass)
const(MyClass)
MyClass
MyClass
```

you should probably not use opApply if your trying to be safe 
(opApplys uses are  hacks like hotloading and injecting long 
distance jumps) its just part of foreach, and foreach makes 
copies anyway unless you say "ref"


More information about the Digitalmars-d-learn mailing list