logical operands on strings

Meta jared771 at gmail.com
Sun Jan 12 11:28:56 PST 2014


On Sunday, 12 January 2014 at 19:12:13 UTC, TheFlyingFiddle wrote:
> On Sunday, 12 January 2014 at 18:37:40 UTC, Erik van Velzen 
> wrote:
>> On Sunday, 12 January 2014 at 18:28:38 UTC, Meta wrote:
>>>
>>> It looks like your opBinary on strings is an attempt at 
>>> globally overriding the XOR operator. I'm almost 100% sure 
>>> this won't work in D. All operator overloads have to be part 
>>> of a class or struct.
>>
>> How would I do that without rewriting an entire string class?
>
> Well something like this.
>
> struct MyString
> {
>    string value;
>    alias value this;
>
>    auto opBinary(string op)(string rhs) if( op == "^" )
>    {
>       string result;
>       foreach(i; 0 .. min(value.length, rhs.length))
>           result ~= value[i] ^ rhs[i];
>       return MyString(result);
>    }
> }
>
> auto mstr(string s)
> {
>    return MyString(s);
> }
>
> auto s   = "Hello";
> auto s2  = "World";
>
>
> auto res = s.mstr ^ s2;
> or
> string res = s.mstr ^ s2; //If you want the result to be a 
> string.
>
> While this works it's not that much better then the simple:
>
> auto s = "Hello";
> auto s2 = "World";
> auto res = s.xor(s2);
>
>> It seems I can't even inherit from string.
>
> In D a string is not a class its just an immutable array 
> (slice) of char.
> alias string = immutable(char[]);

You can also use opBinaryRight for when your custom string class 
is on the right side of the operand, so string ^ MyString also 
works. This pretty much obviates the need for global operator 
overloading, at least in this case.


More information about the Digitalmars-d-learn mailing list