ネタです。rubyで返り値にnilを期待している時にhoge == nilと書いたのが少し気持ち悪かったので、ほかの言語ではどういう扱いなんだろうかとふと調べてみました。
C
% cat << __END_OF_C__ > a.c && gcc a.c && ./a.out; rm a.out a.c #include <stdio.h> int main (void) { if (NULL == NULL) { printf("NULL == NULL\n"); } else { printf("NULL != NULL\n"); } printf("%d\n", (NULL == NULL)); return (0); } __END_OF_C__ NULL == NULL 1
Python
% cat << __END_OF_PYTHON__ | python if None == None: print('None == None') else: print('None != None') print(None == None) __END_OF_PYTHON__ None == None True
Ruby
% cat << __END_OF_RUBY__ | ruby if nil == nil then puts 'nil == nil' else puts 'nil != nil' end puts (nil == nil) __END_OF_RUBY__ nil == nil true
Perl
% cat << __END_OF_PERL__ | perl use strict; use warnings; if (undef == undef) { print 'NULL'; } else { print 'NOT NULL'; } __END_OF_PERL__ Use of uninitialized value in numeric eq (==) at - line 5. Use of uninitialized value in numeric eq (==) at - line 5. NULL
perlだと数値比較だと==、文字列比較だとeqを使うんですが、undefはそのいずれでもないので、undef同士の比較はできないです(たぶん)。
それより、warn吐いているのに演算結果がTrueな理由が気になる。
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
ふむー。なんとなく気持ち悪いですけど、NULL == NULL returns Trueなんですね。ふむー。