On 5/20/18 1:46 PM, Robert M. Münch wrote:
On 2018-05-20 17:40:39 +0000, Robert M. Münch said:
Hi Jonathan, great! This got me a step further. So I can declare my
member now. But I get an implict cast error when I try:
class a {
... myStream;
}
class b {
typeof(a.myStream.filter!(x => x == myMessage)) mySubStream;
}
void myFunc() {
a myA = new a();
b myB = new b();
myB.mySubstream = myA.myStream.filter!(x => x == myMessage);
}
This gives (unnecessary stuff stripped):
Error: cannot implicitly convert expression filter(...) of type
app.myFunc.filter!(x => x == myMessage) to app.b.filter!(x => x ==
myMessage)
Answering myself: Using an alias helps.
alias typeof(a.myStream.filter!(x => x == myMessage)) myMessageType;
So the issue here is that the lambda function inside myFunc is DIFFERENT
than the one inside b. They are both the same function, but with
essentially different names.
When you use the alias, both are using the same exact lambda.
I see you are casting now as well, which looks horrible to me -- if you
change something in your lambda now you are in for some trouble.
What may make more sense (both for type sanity and for code reuse) is to
wrap your call to filter into one place so it can be used wherever you
need it:
auto wrapStream(S)(S str) { return str.filter!(x => x == myMessage); }
class b
{
typeof(wrapStream(a.init.myStream)()) mySubStream;
}
void myFunc() {
a myA = new a;
b myB = new b;
myB.mySubstream = myA.myStream.wrapStream;
}
-Steve