On 7/23/15 9:30 PM, Enjoys Math wrote:
Here's my code:

module grammar;

class Grammar(T : ulong) {
     this(const T[] str) {
         auto grammar = str in grammarCache;

         if (grammar) {
             this = grammar.dup;
         } else {
             this = approximateSmallestGrammar(str);
             grammarCache[str] = this.dup;
         }
     }

     static Grammar approximateSmallestGrammar(const T[] str) {
         return new Grammar();
     }

     @property Grammar dup() {

     }

private:
     this() {}
     static Grammar[T[]] grammarCache;
};


Compiler says 'this' is not an lvalue.  How would I accomplish what I want?


You're approaching this wrong. Do the lookup before deciding whether to instantiate a new object:

static Grammar getGrammar(const T[] str) {
     if(auto x = str in grammarCache)
         return *x;
     else
     {
         auto g = new Grammar;
         grammarCache[str] = g;
         return g;
     }
}

If you always want to dup, then do it outside the lookup. Don't do it in the constructor, you already have an object by then.

-Steve

Reply via email to