V Thu, 31 Jul 2014 02:03:35 +0000 Puming via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> napsáno:
> Hi, > > I'm writing this global Config class, with an AA member: > > ```d > module my.config; > > class Config > { > Command[string] commands; > } > > __gshared Config CONFIG; > ``` > > and initialize it in another module: > > ```d > module my.app; > > import my.config; > > void main() > { > CONFIG = new Config(); > CONFIG.commands["bye"] = new Command(...); // add commands > } > ``` > > This is OK. But when I use a local variable to hold the commands > AA: > > ``` > auto cmds = CONFIG.commands; > cmds["list"] = new Command(...); > ``` > > The command "list" is not added. > > I guess what happened here was that `cmds` is a threadlocal > variable, so the compiler somehow copied the CONFIG.commands. > > My questions are: > > 1. Are AAs reference type? if so, why does the compiler copy it? > 2. How do I reference a member of __gshared global objects? can you post code somewhere? I try it and it works for me. module main; import std.stdio; import config; void main(string[] args) { CONFIG = new Config(); CONFIG.commands["bye"] = "yep"; auto cmds = CONFIG.commands; cmds["list"] = "smt"; writeln(CONFIG.commands); // Lets the user press <Return> before program returns stdin.readln(); } module config; class Config { string[string] commands; this() { // Constructor code } } __gshared Config CONFIG;