Неявные преобразования вполне возможно сделать. Ситуация, когда вы попадаете в беду, это когда вы не знаете, как что-то должно работать.
Пример этого можно увидеть в Javascript, где +
оператор работает по-разному в разное время.
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
Если один из аргументов является строкой, то +
оператор является конкатенацией строк, в противном случае это сложение.
Если вам дан аргумент, и вы не знаете, является ли это строкой или целым числом, и хотите сделать с ним дополнение, это может привести к путанице.
Еще один способ справиться с этим - из базового наследия (из которого следует perl - см. Программирование сложно, давайте приступим к написанию сценариев ... )
В Basic len
функция имеет смысл вызываться только для String (документы для Visual Basic : «Любое допустимое выражение String или имя переменной. Если Expression имеет тип Object, функция Len возвращает размер, так как он будет записан в файл функция FilePut. ").
Perl следует этой концепции контекста. Путаница , которая существует в JavaScript с неявным преобразованием типов для +
оператора является иногда сложением и иногда конкатенации не происходят в Perl , потому что +
это всегда сложение и .
это всегда конкатенация.
Если что-то используется в скалярном контексте, это скаляр (например, использование списка в качестве скаляра, список ведет себя так, как будто это число, соответствующее его длине). Если вы используете строковый оператор ( eq
для проверки равенства, cmp
для сравнения строк), скаляр используется так, как если бы он был строкой. Аналогично, если что-то использовалось в математическом контексте ( ==
для проверки на равенство и <=>
для численного сравнения), скаляр используется, как если бы это было число.
Основное правило для всего программирования - «делай то, что удивляет человека меньше всего». Это не значит, что там нет сюрпризов, но попытка удивить человека меньше всего.
Переходя к близкому родственнику perl - php, бывают ситуации, когда оператор может воздействовать на что-либо в строковом или числовом контексте, и поведение может удивлять людей. ++
Оператор является одним из таких примеров. На цифрах он ведет себя точно так, как ожидалось. При воздействии на строку, например "aa"
, она увеличивает строку ( $foo = "aa"; $foo++; echo $foo;
печатает 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 - Zen of Python, которая гласит (среди прочего): «Должен быть один - и предпочтительно только один - очевидный способ сделать это».
Эти конструктивные различия привели к разным языкам. Есть один способ получить длину числа в Python. Неявное обращение идет вразрез с этой философией.
Связанное чтение: Почему в Ruby нет неявного преобразования Fixnum в String?
perl -e 'print length(100);'
печатает 3.