On 01/03/2012 12:10 AM, Gou Lingfeng wrote: > On Mon, 2012-01-02 at 13:18 +0100, Alex Rønne Petersen wrote: >> On 02-01-2012 06:25, Gou Lingfeng wrote: >>> D's definitions of "is" and "==" have so much redundency. That might >>> indicate some flaw. If references and values (for classes and arrays) >>> could be clearly distinguished in the syntax, the "is" operator is not >>> necessary at all. >> >> Of course it is. 'is' is strictly identity, while == would call an >> overloaded opEquals, if any exists. This difference in semantics is >> *very* important when you do *not* want to call opEquals. > > My impression is that, in D, references are wrapped (protected) > pointers, and there are values behind. Although opEquals can be defined > anyway, it's usually some function depending on the values, not > pointers. If we could clearly show whether we wan't pointer comparison > or value comparison, then "a is b" would be "pointer(a)==pointer(b)", > and "a==b" "value(a)==value(b)". > > Or "is" sould evaluate false for "int is int", and true or false for > expressions like "int is (ref int)" and "(ref int) is (ref int)". So it > has a consistant meaning everywhere: whether a and b refer to exactly > the same memory location. And there's no redundency. > >
Sortof. There are shortcomings to thinking about it that way ;) Here's my take: 'is' is the /identity/ operator. It is true when the two operands hold the same thing, the same instance. '==' is the /equality/ operator. It is true when the two operands hold things which are equivalent. Here is an example: import std.stdio; void main() { string str1 = "foo"; string str2 = str1.idup; if ( str1 == str2 ) writeln("str1 == str2"); if ( str1 !is str2 ) writeln("str1 !is str2"); } It should print this: str1 == str2 str1 !is str2 In this case the strings are equal because they share the same contents, but they are not identical because they are different (instances of) strings.