隐式转换是完全可能的。遇到麻烦的情况是当您不知道某件事情应该以哪种方式工作时。
在Javascript中可以看到一个示例,其中+
运算符在不同的时间以不同的方式工作。
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
如果参数之一是字符串,则+
运算符是字符串连接,否则为加法。
如果给定一个参数并且不知道它是字符串还是整数,并且想对其进行加法运算,则可能会有些混乱。
处理此问题的另一种方法是来自Basic继承(perl遵循-请参阅“ 编程很困难,让我们开始编写脚本...”)
在Basic中,len
仅在String上调用该函数才有意义(Visual Basic文档:“任何有效的String表达式或变量名。如果Expression的类型为Object,则Len函数将返回其大小,因为它将被写入文件FilePut函数。”)。
Perl遵循上下文的概念。在Javascript中存在与该类型的隐式转换的混乱+
运营商是有时此外,有时串联不perl的发生,因为+
是总是加法和.
为总级联。
如果在标量上下文中使用某物,则其为标量(例如,使用列表作为标量,则列表的行为就好像它是一个与其长度相对应的数字一样)。如果您使用字符串运算符(eq
用于相等性测试,cmp
用于字符串比较),则将标量当作字符串使用。同样,如果在数学上下文中使用了某些东西(==
用于相等性检验和<=>
数值比较),则将标量当作数字使用。
所有编程的基本规则是“做最令人惊讶的事情”。这并不意味着那里没有惊喜,但努力是使人感到最少的惊喜。
接近perl-php的表亲,在某些情况下,操作员可以在字符串或数字上下文中对某物进行操作,而这种行为对于人们而言可能是令人惊讶的。所述++
操作者是一个这样的例子。在数字上,它的行为完全符合预期。当作用于字符串(例如)时"aa"
,它会增加字符串($foo = "aa"; $foo++; echo $foo;
print ab
)。它还将翻转,以便az
当增加时变为ba
。这还不足为奇。
$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
(ideone)
打印输出:
3d8
3d9
3e0
4
欢迎注意隐式转换和运算符在同一字符串上作用不同的危险。(Perl的句柄代码块有点不同-它决定了"3d8"
当++
应用于运营商从一开始就是一个数值,去4
的时候了(ideone) -这种行为是在很好的描述perlop中:自动递增和自动递减)
现在,为什么一种语言以一种方式做某事,而另一种语言以另一种方式做事却引起了设计师的设计思想。Perl的理念是:做到这一点不止一种方法 -我可以想到许多执行其中某些操作的方法。另一方面,Python在PEP 20(Python的禅宗)中描述了一种哲学,该哲学指出(除其他事项外):“应该有一种-最好只有一种-显而易见的方法。”
这些设计差异导致了不同的语言。在Python中有一种获取数字长度的方法。隐式转换违背了这种哲学。
相关阅读:为什么Ruby没有将Fixnum隐式转换为String?
perl -e 'print length(100);'
打印3