Re: C#'s 'is' equivalent in D

2019-10-10 Thread jmh530 via Digitalmars-d-learn

On Thursday, 10 October 2019 at 16:33:47 UTC, H. S. Teoh wrote:
On Thu, Oct 10, 2019 at 03:58:02PM +, jmh530 via 
Digitalmars-d-learn wrote:

On Thursday, 10 October 2019 at 15:47:58 UTC, Just Dave wrote:
> In C# you can do something like:
> 
> 
> if (obj is Person)

> {
> var person = obj as Person;
> // do stuff with person...
> }

[...]

You mean something like below:

class Person {
int id;
this(int x) {
id = x;
}
}

void main() {
auto joe = new Person(1);
if (is(typeof(joe) == Person)) {
assert(joe.id == 1);
}
}


Unfortunately, typeof is a compile-time construct, so this will 
not work if you're receiving a Person object via a base class 
reference. The correct solution is to cast the base class to 
the derived type, which will yield null if it's not an instance 
of the derived type.



T


Ah, you mean something like below:

class Person {
int id;
this(int x) {
id = x;
}
}

class Employee : Person {
int job_id;
this(int x, int y) {
super(x);
job_id = y;
}
}

void main() {
import std.stdio : writeln;

Person joe = new Employee(1, 2);

if (is(typeof(joe) == Employee)) {
writeln("here"); //not called in this case
}
}



Re: C#'s 'is' equivalent in D

2019-10-10 Thread H. S. Teoh via Digitalmars-d-learn
On Thu, Oct 10, 2019 at 03:58:02PM +, jmh530 via Digitalmars-d-learn wrote:
> On Thursday, 10 October 2019 at 15:47:58 UTC, Just Dave wrote:
> > In C# you can do something like:
> > 
> > 
> > if (obj is Person)
> > {
> > var person = obj as Person;
> > // do stuff with person...
> > }
[...]
> You mean something like below:
> 
> class Person {
> int id;
> this(int x) {
> id = x;
> }
> }
> 
> void main() {
> auto joe = new Person(1);
> if (is(typeof(joe) == Person)) {
> assert(joe.id == 1);
> }
> }

Unfortunately, typeof is a compile-time construct, so this will not work
if you're receiving a Person object via a base class reference. The
correct solution is to cast the base class to the derived type, which
will yield null if it's not an instance of the derived type.


T

-- 
LINUX = Lousy Interface for Nefarious Unix Xenophobes.


Re: C#'s 'is' equivalent in D

2019-10-10 Thread jmh530 via Digitalmars-d-learn

On Thursday, 10 October 2019 at 15:47:58 UTC, Just Dave wrote:

In C# you can do something like:


if (obj is Person)
{
var person = obj as Person;
// do stuff with person...
}

where you can check the type of an object prior to casting. 
Does D have a similar mechanism? It's so widely useful in the 
C# realm that they even added syntactic sugar to allow:


if (obj is Person person)
{
// do stuff with person...
}

I would presume since D has reference objects there must exist 
some mechanism for this...


You mean something like below:

class Person {
int id;
this(int x) {
id = x;
}
}

void main() {
auto joe = new Person(1);
if (is(typeof(joe) == Person)) {
assert(joe.id == 1);
}
}


Re: C#'s 'is' equivalent in D

2019-10-10 Thread Just Dave via Digitalmars-d-learn

On Thursday, 10 October 2019 at 15:53:20 UTC, Adam D. Ruppe wrote:

On Thursday, 10 October 2019 at 15:47:58 UTC, Just Dave wrote:

if (obj is Person person)


Looks the same as D's

if(auto person = cast(Person) obj) {
  // use person in here
} else {
  // it was some other type
}


Excellent!


Re: C#'s 'is' equivalent in D

2019-10-10 Thread Jonathan M Davis via Digitalmars-d-learn
On Thursday, October 10, 2019 9:47:58 AM MDT Just Dave via Digitalmars-d-
learn wrote:
> In C# you can do something like:
>
>
>  if (obj is Person)
>  {
>  var person = obj as Person;
>  // do stuff with person...
>  }
>
> where you can check the type of an object prior to casting. Does
> D have a similar mechanism? It's so widely useful in the C# realm
> that they even added syntactic sugar to allow:
>
>  if (obj is Person person)
>  {
>  // do stuff with person...
>  }
>
> I would presume since D has reference objects there must exist
> some mechanism for this...

D's solution is basically the same as C++'s solution. You cast and then
check whether the result is null. So,

if(cast(Person)obj !is null)
{
}

or since using a pointer or reference in an if condition checks whether it's
null or not

if(cast(Person)obj)
{
}

and you can even declare a variable that way if you want. e.g.

if(auto person = cast(Person)obj)
{
}

When D's is is used to compare two objects, it checks whether they're equal
bitwise. So, it's typically used for comparing pointers or references for
equality (whereas using == with references would compare the objects
themselves for equality).

- Jonathan M Davis





Re: C#'s 'is' equivalent in D

2019-10-10 Thread drug via Digitalmars-d-learn

On 10/10/19 6:47 PM, Just Dave wrote:

In C# you can do something like:


     if (obj is Person)
     {
     var person = obj as Person;
     // do stuff with person...
     }

where you can check the type of an object prior to casting. Does D have 
a similar mechanism? It's so widely useful in the C# realm that they 
even added syntactic sugar to allow:


     if (obj is Person person)
     {
     // do stuff with person...
     }

I would presume since D has reference objects there must exist some 
mechanism for this...


```D
  if (auto person = cast(Person) obj)
  {
  // do stuff with person...
  }
```


Re: C#'s 'is' equivalent in D

2019-10-10 Thread Adam D. Ruppe via Digitalmars-d-learn

On Thursday, 10 October 2019 at 15:47:58 UTC, Just Dave wrote:

if (obj is Person person)


Looks the same as D's

if(auto person = cast(Person) obj) {
  // use person in here
} else {
  // it was some other type
}



Re: C#'s 'is' equivalent in D

2019-10-10 Thread Just Dave via Digitalmars-d-learn
Even though static solutions would be more performance minded, 
I'd actually prefer to see the runtime equivalent so I don't have 
to rethink how I think as performance isn't really my major 
concern right now.