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