On Monday, 1 May 2017 at 21:50:02 UTC, Jonathan Marler wrote:
On Monday, 1 May 2017 at 12:41:19 UTC, Steven Schveighoffer
wrote:
On 4/30/17 7:59 PM, Jonathan Marler wrote:
On Sunday, 30 April 2017 at 23:44:32 UTC, Steven
Schveighoffer wrote:
On 4/30/17 7:35 PM, Jonathan Marler wrote:
Any reason why "alias this" doesn't work at the module
level? If I
recall correctly, a module is really just a "class" under
the hood, but
when I tried to use it I got:
Error: alias this can only be a member of aggregate, not
module
<module-name>
public import is to modules as alias this is to
structs/classes :)
They're actually different.
//
// File: mymodule.d
//
module mymodule;
struct Foo
{
int bar;
void baz();
}
__gshared Foo foo;
alias foo this; // using "alias this" on a module
So you want to alias a struct to a module? That's different
than what I thought, I thought you wanted to alias one
module's members into another.
I can't see a reason why it couldn't be added as a feature. I
admit I'm not seeing the benefit though.
You could simulate this via a mixin. e.g.:
void baz()
{
foo.baz;
}
@property ref bar()
{
return foo.bar;
}
-Steve
Ya now you get it. It's not a big deal, it's just that after I
thought about it, I couldn't think of a reason why it's not
supported. I actually have an application for it too. Since
modules are just classes under the hood, I was wondering if
implementing it would be as simple as commenting out an error
message like Andre's [nested import
example](https://www.youtube.com/watch?v=3NihZVcZqto&t=183s&#t=27m15s)
The common thing between modules and the other aggregate types
(classes, interfaces, unions and structs) is that members of the
former behave as if they were static members of the later. The
difference, of course, is that since modules can have only static
members, they can't be instantiated and by extension have no
'this' pointer/reference. Because of this I think 'alias member
this' on the module level would be nonsensical. Keep in mind that
'alias member this' is a tool for establishing a subtyping
relationship - i.e. 'this' instance can be used wherever 'member'
can be used - and not just a way to do member access rewrite like
opDispatch. There is no subtyping relationship between
namespaces, which is what modules are effectively​.
On the other hand, 'alias bar = foo.bar' and module level static
opDispatch seem like perfectly reasonable and desirable features.