Неявні перетворення цілком можливо зробити. Ситуація, коли ти потрапляєш у біду, - це коли ти не знаєш, в якому напрямку щось має працювати.
Приклад цього можна побачити в Javascript, де +
оператор працює в різні періоди по-різному.
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
Якщо одним з аргументів є рядок, то +
оператор - це об'єднання рядків, інакше це додавання.
Якщо вам дають аргумент і не знаєте, чи це рядок або ціле число, і ви хочете зробити з ним доповнення, це може бути безладно.
Ще один спосіб вирішити це - з базової спадщини (ця хитрість випливає з - див. Програмування важко, Давайте підемо сценарій ... )
У Основному len
функція має сенс викликати лише String (документи для візуального 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";
( ideone )
Це видає:
3d8
3d9
3e0
4
Ласкаво просимо до небезпеки неявних перетворень та операторів, які діють на одній і тій же строці. (Perl обробляє цей код блоком трохи інакше - він вирішує, що "3d8"
коли застосований ++
оператор, є числовим значенням з самого початку і переходить 4
відразу ( ideone ) - така поведінка добре описана в perlop: Auto-increment і Auto-decrement )
Тепер, чому одна мова робить щось по-іншому, а інша робить іншим способом, потрапляє до дизайнерських думок дизайнерів. Філософія Perl полягає в тому, що це існує більше ніж один спосіб - і я можу придумати декілька способів зробити деякі з цих операцій. З іншого боку, у Python є філософія, описана в PEP 20 - Zen of Python, де сказано (серед іншого): "Має бути один - і бажано лише один - очевидний спосіб зробити це".
Ці відмінності в дизайні призвели до різних мов. Існує один спосіб отримати довжину числа в Python. Неявне перетворення суперечить цій філософії.
Пов’язане читання: Чому Ruby не має неявного перетворення Fixnum в String?
perl -e 'print length(100);'
принти 3.