On Tuesday, 22 April 2014 at 03:57:33 UTC, Timothee Cour via
Digitalmars-d-learn wrote:
you can use stuff.canFind(2)
but sometimes it'd be more convenient to have the other way
around (UFCS
chains etc);
how about:
bool isIn(T,T2...)(T needle, T2 haystack)
if(__traits(compiles,T.init==T2[0].init)){
foreach(e;haystack){
if(needle==e) return true;
}
return false;
}
unittest{
assert(1.isIn(3,1,2) && !4.isIn(3,1,2));
}
I like it! I didn't know you could use templates like that!
Question though? why doesn't canFind() work on statically
allocated arrays?
import std.stdio;
import std.algorithm;
bool contains(T)( T[] haystack,T needle){
foreach(T e;haystack){
if(needle==e) return true;
}
return false;
}
unittest{
assert([3,1,2].contains(1) && ![3,1,2].contains(4));
}
void main(string[] args)
{
int[3] stuff=[0,1,2];
if (stuff.contains(2))
{
writeln("Hello World!");
}
if (stuff.canFind(2)){ // No compile with stuff -> static
writeln("This Also WOrks");
}
}
On Mon, Apr 21, 2014 at 8:25 PM, Taylor Hillegeist via
Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com> wrote:
So I find myself Doing this kind of thing very frequently. I
have a Array
of Somethings and i want to see if "something specific" is
inside the
array. I wrote a template for it. but is this the best way to
do this kind
of thing. I feel like it doesn't help with readability. Is
there a better
way? Maybe i missed something in the std library.
import std.stdio;
template FNDR(T){
bool isIn(T Element, T[] Array){
bool rtn=false;
foreach(T ArrayElement; Array){
if(Element==ArrayElement){
rtn=true;
}
}
return rtn;
}
}
void main(string[] args)
{
int[3] stuff=[0,1,2];
if (FNDR!int.isIn(2,stuff))
{
writeln("Hello World!");
}
}
Is there a way maybe to make it look like this?
import std.stdio;
template FNDR(T){
bool contains(T[] Array,T Element){
bool rtn=false;
foreach(T ArrayElement; Array){
if(Element==ArrayElement){
rtn=true;
}
}
return rtn;
}
}
void main(string[] args)
{
int[3] stuff=[0,1,2];
if (stuff.contains(2)) // Much clean!
stuff.FNDR!int.contains(2)
doesn't work
{
writeln("Hello World!");
}
}
I'm interested in what you guys think? what is the cleanest
way to do this?