问题
Okay so I came across a code which looks like
@documents_names = sort {
!!$deleted_documents_names{$a} == !!$deleted_documents_names{$b}
? uc($a) cmp uc($b)
: !!$deleted_documents_names{$a}
cmp !!$deleted_documents_names{$b}
} @documents_names;
It's the first time I'm seeing the use of double negation. What's the use of it? When would a person use it?
回答1:
It converts non-boolean types to boolean (dualvar(0,"")
or 1
).
It is a shortcut way of doing this, instead of trying to cast it explicitly (which may take more characters). The !
operator negates the truthness of its argument. Hence, two of them are used.
Many object types are "truthy", and others are "falsey".
- The only false values are
0
,undef
,""
,"0"
and some overloaded objects. - Examples of true values are
1
,"asdf"
, and all other values.
回答2:
That is a lot of funk for a sort
block!
It's essentially a two-level sort :
- ascii-betical
- deleted files first, then undeleted
So one could rewrite it as (untested):
@documents = sort { exists $deleted_documents_names{$a} # same effect as '!!'
<=>
exists $deleted_documents_names{$b}
||
uc( $a ) cmp uc( $b )
}
@documents;
来源:https://stackoverflow.com/questions/12278997/use-of-double-negation