Bug 6854 – delegates does not work outside of object
Status
RESOLVED
Resolution
INVALID
Severity
major
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Linux
Creation time
2011-10-25T16:30:00Z
Last change time
2011-10-25T20:11:42Z
Assigned to
nobody
Creator
tbolsh
Comments
Comment #0 by tbolsh — 2011-10-25T16:30:25Z
Dmd generate an error where it did not before (~2.032) and as far as I understand the language where it should not.
dmd version: 2.055
OS Linux
Here is the piece of code:
________________________________________________________________
#!/usr/bin/rdmd
import std.datetime;
alias bool delegate ( ) predicate;
predicate wait_for_seconds( immutable uint seconds = 0 ){
immutable long start = SysTime.stdTime;
return delegate (){ return seconds==0 ? true : ( (SysTime.stdTime - start) < seconds*10_000_000L ); };
}
void main( string [] args ){
}
______________________________________________________________
here is what compiler tells:
./tst.d(8): Error: 'this' is only defined in non-static member functions, not __dgliteral1
Comment #1 by issues.dlang — 2011-10-25T16:51:29Z
That code is definitely wrong. stdTime is not a static function. It must be called on an object of type SysTime, not on the type itself. You probably want something more like this:
import std.datetime;
alias bool delegate ( ) predicate;
predicate wait_for_seconds( immutable uint seconds = 0 )
{
auto start = Clock.currTime();
return delegate ()
{
return seconds == 0 ? true
: Clock.currTime() - start < dur!"seconds"(seconds);
};
}
void main( string [] args )
{
}
though whether that does exactly what you want, I don't know (e.g. I would have that that you'd want to use >, not < given the function name, but your code has <).
You might want to check out this article if you want know more about std.datetime beyond just reading the docs: http://d-programming-language.org/intro-to-datetime.html
Comment #2 by tbolsh — 2011-10-25T20:11:42Z
Sorry - you are 100% right - filed a bug too fast. really sorry.