Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
March 04, 2011 Overriding "in" operator | ||||
---|---|---|---|---|
| ||||
I'm writing a collection with functionality for membership checking. I thought it would be nice to use the "in" operator. In the docs for std.collections I surmise that this is the standard way to go. From the source code, I see there's no special opIn, but that it can be done with the more general...
bool opBinary(string op)(T k) if (op == "in") {
...
}
Here T is, of course, a compile-time argument of the surrounding struct or class.
So ... this is used in the the Phobos source in the DMD 2.052 distro (if I'm not mistaken), but I can't get dmd 2.052 to accept it? I keep getting the error message "Error: rvalue of in expression must be an associative array, not Foo!(uint)".
I guess either that this is a recent feature -- I didn't see it mentioned in Andrei's book -- and that my Phobos source is too recent for my dmd ... or that I'm doing something wrong elsewhere in my code, preventing the operator overloading to take force. Suggestions/solutions?-)
--
Magnus Lie Hetland
http://hetland.org
|
March 04, 2011 Re: Overriding "in" operator | ||||
---|---|---|---|---|
| ||||
Posted in reply to Magnus Lie Hetland | Am 04.03.2011 17:01, schrieb Magnus Lie Hetland:
> I'm writing a collection with functionality for membership checking. I
> thought it would be nice to use the "in" operator. In the docs for
> std.collections I surmise that this is the standard way to go. From the
> source code, I see there's no special opIn, but that it can be done with
> the more general...
>
> bool opBinary(string op)(T k) if (op == "in") {
> ...
> }
>
> Here T is, of course, a compile-time argument of the surrounding struct
> or class.
>
> So ... this is used in the the Phobos source in the DMD 2.052 distro (if
> I'm not mistaken), but I can't get dmd 2.052 to accept it? I keep
> getting the error message "Error: rvalue of in expression must be an
> associative array, not Foo!(uint)".
>
> I guess either that this is a recent feature -- I didn't see it
> mentioned in Andrei's book -- and that my Phobos source is too recent
> for my dmd ... or that I'm doing something wrong elsewhere in my code,
> preventing the operator overloading to take force. Suggestions/solutions?-)
>
If you try to use it in the manner of `something in classWhichDefinesThisOpBinary` then it doesn't work because operator overloading normally overloads on the left operand (ie something). Use opBinaryRight(string op)(...) if(...) to get it working.
Mafi
|
March 04, 2011 Re: Overriding "in" operator | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mafi | On 2011-03-04 17:06:29 +0100, Mafi said: > If you try to use it in the manner of `something in classWhichDefinesThisOpBinary` then it doesn't work because operator overloading normally overloads on the left operand (ie something). Use opBinaryRight(string op)(...) if(...) to get it working. Aaah. That makes sense. And works. *But*: I copied my code from Phobos :D If you search for "in", with the quotes, in std/container.d, you'll find two occurrences. The actual live use (in RedBlackTree) is opBinaryRight (which makes sense), but in the dummy class, TotalContainer, which is described as "an unimplemented container that illustrates a host of primitives that a container may define", uses just opBinary. The doc-comment says that "$(D k in container) returns true if the given key is in the container". So ... a "bug", I guess? (One that isn't really executed -- but still...) Worth reporting? Anwyay: Thanks for the clarification :) -- Magnus Lie Hetland http://hetland.org |
March 04, 2011 Re: Overriding "in" operator | ||||
---|---|---|---|---|
| ||||
Posted in reply to Magnus Lie Hetland | Magnus Lie Hetland <magnus@hetland.org> wrote: > On 2011-03-04 17:06:29 +0100, Mafi said: > >> If you try to use it in the manner of `something in classWhichDefinesThisOpBinary` then it doesn't work because operator overloading normally overloads on the left operand (ie something). Use opBinaryRight(string op)(...) if(...) to get it working. > > Aaah. That makes sense. And works. > > *But*: I copied my code from Phobos :D If you search for "in", with the quotes, in std/container.d, you'll find two occurrences. The actual live use (in RedBlackTree) is opBinaryRight (which makes sense), but in the dummy class, TotalContainer, which is described as "an unimplemented container that illustrates a host of primitives that a container may define", uses just opBinary. The doc-comment says that "$(D k in container) returns true if the given key is in the container". > > So ... a "bug", I guess? (One that isn't really executed -- but still...) Worth reporting? > > Anwyay: Thanks for the clarification :) Definitely report it. -- Simen |
March 04, 2011 Re: Overriding "in" operator | ||||
---|---|---|---|---|
| ||||
Posted in reply to Magnus Lie Hetland | On 03/04/2011 05:01 PM, Magnus Lie Hetland wrote: > I'm writing a collection with functionality for membership checking. I thought > it would be nice to use the "in" operator. In the docs for std.collections I > surmise that this is the standard way to go. From the source code, I see > there's no special opIn, but that it can be done with the more general... > > bool opBinary(string op)(T k) if (op == "in") { > ... > } > > Here T is, of course, a compile-time argument of the surrounding struct or class. > > So ... this is used in the the Phobos source in the DMD 2.052 distro (if I'm > not mistaken), but I can't get dmd 2.052 to accept it? I keep getting the error > message "Error: rvalue of in expression must be an associative array, not > Foo!(uint)". > > I guess either that this is a recent feature -- I didn't see it mentioned in > Andrei's book -- and that my Phobos source is too recent for my dmd ... or that > I'm doing something wrong elsewhere in my code, preventing the operator > overloading to take force. Suggestions/solutions?-) Didn't even know 'in' can be defined with opBinary... I use opIn_r ('r' for right side, since the container stand on the right of the expression) everywhere, and it works fine. Denis -- _________________ vita es estrany spir.wikidot.com |
March 04, 2011 Re: Overriding "in" operator | ||||
---|---|---|---|---|
| ||||
Posted in reply to spir | On 2011-03-04 18:08:08 +0100, spir said: > Didn't even know 'in' can be defined with opBinary... > I use opIn_r ('r' for right side, since the container stand on the right of the expression) everywhere, and it works fine. Huh. Cool. Works like a charm. Seems cleaner like the opBinaryRight solution, really. I just didn't know of it :) -- Magnus Lie Hetland http://hetland.org |
March 04, 2011 Re: Overriding "in" operator | ||||
---|---|---|---|---|
| ||||
Posted in reply to Magnus Lie Hetland | On 03/04/2011 10:41 AM, Magnus Lie Hetland wrote: > On 2011-03-04 18:08:08 +0100, spir said: > >> Didn't even know 'in' can be defined with opBinary... >> I use opIn_r ('r' for right side, since the container stand on the >> right of the expression) everywhere, and it works fine. > > Huh. Cool. Works like a charm. Seems cleaner like the opBinaryRight > solution, really. I just didn't know of it :) > It can be seen on the D1 documentation: http://www.digitalmars.com/d/1.0/operatoroverloading.html That is (or "will be") deprecated in D2. Ali |
Copyright © 1999-2021 by the D Language Foundation