暗黙的な変換は非常に可能です。トラブルが発生する状況は、何かが機能する方法がわからない場合です。
この例は、Javascriptで見ることができます。この場合、+
オペレーターはさまざまなタイミングでさまざまな方法で作業します。
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
引数の1つが文字列の場合、+
演算子は文字列連結です。それ以外の場合は加算です。
引数が与えられ、それが文字列なのか整数なのかわからず、それを追加したい場合は、少し混乱する可能性があります。
これに対処する別の方法は、基本的な遺産からのものです(perlの由来- プログラミングは難しい、スクリプトを書きましょう...を参照)
Basicでは、len
関数は文字列で呼び出された場合にのみ意味を持ちます(Visual Basicのドキュメント:「任意の有効な文字列式または変数名。ExpressionがObject型の場合、Len関数はファイルに書き込まれるサイズを返します。 FilePut関数。」)。
Perlはこのコンテキストの概念に従います。JavaScriptに存在する混乱は+
、perlでは演算子の型の暗黙的な変換が追加されたり連結されたりすることがあるため、perlでは発生しません。+
常に加算と.
で常に連結。
スカラーコンテキストで何かが使用される場合、そのスカラー(たとえば、リストをスカラーとして使用すると、リストはあたかもその長さに対応する数であるかのように動作します)。文字列演算子を使用する場合(eq
等価性テスト、cmp
文字列比較)、スカラーは文字列であるかのように使用されます。同様に、数学コンテキストで(==
等式テストおよび<=>
数値比較のために)何かが使用された場合、スカラーは数値であるかのように使用されます。
すべてのプログラミングの基本的なルールは、「人を一番驚かせるようなことをする」ことです。これは、そこに驚きがないことを意味するものではありませんが、その努力はその人を少なくとも驚かせることです。
perl-phpの親coに行くと、オペレーターが文字列または数値のコンテキストで何かを実行できる状況があり、その振る舞いは人々にとって驚くべきものです。++
オペレータはその一例です。数値では、期待どおりに動作します。などの文字列に作用すると、文字列を"aa"
インクリメントします($foo = "aa"; $foo++; echo $foo;
prints ab
)。また、ロールオーバーするため、az
増分するとになりba
ます。これはまだ特に驚くことではありません。
$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
(イデオネ)
これは印刷されます:
3d8
3d9
3e0
4
暗黙の変換と同じ文字列で異なる動作をする演算子の危険性へようこそ。(Perlはそのコードブロックを少し異なる方法で処理します- 演算子が適用されると、最初から数値であると判断し"3d8"
、すぐに++
進み4
ます(ideone)-この動作はperlopで詳しく説明されています:自動インクリメントおよび自動デクリメント)
さて、なぜある言語が何らかの方法で何かをし、別の言語が別の方法でそれを行うのかが、デザイナーの設計思想に到達します。Perlの哲学は、複数の方法があります -そして、これらの操作のいくつかを行ういくつかの方法を考えることができます。一方、Pythonには、PEP 20-The Zen of Pythonに記載されている哲学があります。
これらの設計の違いにより、言語が異なります。Pythonで数値の長さを取得する方法は1つあります。暗黙の変換は、この哲学に反します。
関連資料:RubyでFixnumをStringに暗黙的に変換できないのはなぜですか?
perl -e 'print length(100);'
3.