Konversi tersirat sangat mungkin dilakukan. Situasi di mana Anda mendapat masalah adalah ketika Anda tidak tahu ke arah mana sesuatu harus bekerja.
Contohnya dapat dilihat dalam Javascript di mana +
operator bekerja dengan cara yang berbeda pada waktu yang berbeda.
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
Jika salah satu argumennya adalah string, maka +
operatornya adalah rangkaian string, jika tidak maka itu adalah penambahan.
Jika Anda diberi argumen dan tidak tahu apakah itu string atau integer, dan ingin melakukan penambahan dengannya, itu bisa menjadi sedikit berantakan.
Cara lain untuk mengatasinya adalah dari warisan Dasar (yang diikuti oleh perl - lihat Pemrograman adalah Hard, Let's Go Scripting ... )
Dalam Dasar, len
fungsi hanya masuk akal dipanggil pada String (docs untuk visual basic : "Setiap ekspresi String yang valid atau nama variabel. Jika Ekspresi adalah tipe objek, fungsi Len mengembalikan ukuran karena akan ditulis ke file oleh fungsi FilePut. ").
Perl mengikuti konsep konteks ini. Kebingungan yang ada di JavaScript dengan konversi implisit dari jenis untuk +
operator yang menjadi kadang-kadang Selain dan kadang-kadang Rangkaian tidak terjadi di perl karena +
merupakan selalu penambahan dan .
adalah selalu Rangkaian.
Jika sesuatu digunakan dalam konteks skalar, itu skalar (misalnya menggunakan daftar sebagai skalar, daftar berperilaku seolah-olah itu adalah angka yang sesuai dengan panjangnya). Jika Anda menggunakan operator string ( eq
untuk uji persamaan, cmp
untuk perbandingan string) skalar digunakan seolah-olah itu adalah string. Demikian juga, jika sesuatu digunakan dalam konteks matematika ( ==
untuk uji kesetaraan dan <=>
perbandingan numerik), skalar digunakan seolah-olah itu angka.
Aturan dasar untuk semua pemrograman adalah "lakukan hal yang paling mengejutkan orang". Ini tidak berarti tidak ada kejutan di sana, tetapi usahanya adalah untuk mengejutkan orang itu.
Pergi ke sepupu dekat perl - php, ada situasi di mana operator dapat bertindak pada sesuatu baik dalam konteks string atau numerik dan perilaku dapat mengejutkan orang. The ++
operator adalah salah satu contohnya. Pada angka, ia berperilaku tepat seperti yang diharapkan. Saat bertindak pada string, seperti "aa"
, itu menambah string ( $foo = "aa"; $foo++; echo $foo;
cetakan ab
). Itu juga akan berguling sehingga az
ketika bertambah menjadi ba
. Ini belum terlalu mengejutkan.
$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
( ideone )
Ini mencetak:
3d8
3d9
3e0
4
Selamat datang di bahaya konversi tersirat dan operator yang bertindak berbeda pada string yang sama. (Perl menangani blok kode itu sedikit berbeda - ia memutuskan bahwa "3d8"
ketika ++
operator diterapkan adalah nilai numerik dari awal dan 4
langsung pergi ( ideone ) - perilaku ini dijelaskan dengan baik dalam perlop: Auto-increment dan Auto-decrement )
Sekarang, mengapa satu bahasa melakukan sesuatu dengan satu cara dan yang lain melakukannya dengan cara lain sampai pada pemikiran desain para desainer. Filosofi Perl adalah Ada lebih dari satu cara untuk melakukannya - dan saya dapat memikirkan sejumlah cara untuk melakukan beberapa operasi ini. Di sisi lain, Python memiliki filosofi yang dijelaskan dalam PEP 20 - The Zen of Python yang menyatakan (antara lain): "Harus ada satu - dan lebih disukai hanya satu - cara yang jelas untuk melakukannya."
Perbedaan desain ini mengarah ke berbagai bahasa. Ada satu cara untuk mendapatkan panjang angka dalam Python. Konversi implisit bertentangan dengan filosofi ini.
Bacaan terkait: Mengapa Ruby tidak memiliki konversi implisit Fixnum menjadi String?
perl -e 'print length(100);'
cetakan 3.