Comparing Multiple Values

Bill Baxter dnewsgroup at billbaxter.com
Tue Mar 11 12:26:55 PDT 2008


downs wrote:
> Bill Baxter wrote:
>> downs wrote:
>>> Bill Baxter wrote:
>>>> okibi wrote:
>>>>> I've looked all over the site but can't seem to find if D supports any
>>>>> kind of like IN statement for comparisons. For example, I can do the
>>>>> following in SQL:
>>>>>
>>>>> select *
>>>>> from table
>>>>> where value in (1,2,3)
>>>>>
>>>>> And it will compare it to 1, 2, and 3. Is this possible to do within
>>>>> D's if statement? I hate to go about it as such:
>>>>>
>>>>> if (value == 1 || value == 2 || value == 3)
>>>>>     dosomething();
>>>>>
>>>>> Just seems like this could be written better. Can anyone give me any
>>>>> pointers?
>>>> I can point you to a bunch of discussions where certain people argued
>>>> tooth and nail that  "if(value in [1,2,3])" should mean
>>>> "if(value==0||value==1||value==2)", leading basically to a stalemate.
>>>> So, no.  Nothing like that is in the language.
>>>>
>>>> But you can write a little "contains" function that will do the trick.
>>>>
>>>> Or ask Downs how to make "if(x /In/ [1,2,3])" work.
>>>>
>>>> --bb
>>> There's a better way actually.
>>>
>>> import std.stdio;
>>>
>>> // bottom-inclusive, top-exclusive, like slices.
>>> struct _Range(T) {
>>>   T from, to;
>>>   bool opIn_r(U)(U u) {
>>>     return u < to && u !< from;
>>>   }
>>> }
>>>
>>> struct Range {
>>>   static _Range!(T) opSlice(T, U)(T from, U to) {
>>>     return _Range!(T)(from, to);
>>>   }
>>> }
>>>
>>> void main() {
>>>   writefln(3 in Range[2..4], " -- ", 4 in Range[2..4]);
>>> }
>>>
>>> Have funs!
>> What?! Dost mine eyes deceive me?  Downs just gave up an opportunity to
>> proselytize about his infix operators?
>> This is sure a sign of the end times, my friends.
>>
>> --bb
> 
> Um.
> 
> `in` already is an infix operator :)
> 
>  --downs

Yes, but it doesn't work!

--bb


More information about the Digitalmars-d-learn mailing list