Örtük dönüşümler yapmak oldukça mümkündür. Başın belada olduğu durum, bir şeyin hangi şekilde çalışması gerektiğini bilmediğin zamandır.
Bunun bir örneği, +
operatörün farklı zamanlarda farklı şekillerde çalıştığı Javascript'te görülebilir .
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
Bağımsız değişkenlerden biri bir dize ise, +
işleç bir dize birleşimidir, aksi takdirde ekleme yapılır.
Bir bağımsız değişken verilirse ve bunun bir dize mi yoksa tamsayı mı olduğunu bilmiyorsanız ve buna bir ekleme yapmak istiyorsanız, biraz karışıklık olabilir.
Bununla başa çıkmanın bir başka yolu, Temel mirastır (perl'in izlediği - bkz. Programlama Zor, Komut Dosyasına Girelim ... )
Basic'te, len
işlev yalnızca bir String'de çağrılmayı gerektirir ( visual basic için dokümanlar : "Geçerli herhangi bir String ifadesi veya değişken adı. İfade Object türündeyse, Len işlevi boyutu dosyaya FilePut işlevi. ").
Perl bu bağlam kavramını takip eder. İçin tiplerinin örtük dönüşüm ile JavaScript var karışıklık +
operatörü bazen ilave olarak bazen birleştirme perl'de olmaz çünkü +
olduğunu her zaman ekleme ve .
olduğunu her zaman birleştirme.
Skaler bağlamda bir şey kullanılırsa, bu bir skalerdir (örneğin, bir listeyi skaler olarak kullanmak, liste uzunluğuna karşılık gelen bir sayı gibi davranır). Bir dize operatörü kullanırsanız ( eq
eşitlik testi cmp
için, dize karşılaştırması için) skaler, bir dizemiş gibi kullanılır. Benzer şekilde, bir matematik bağlamında bir şey kullanılmışsa ( ==
eşitlik testi ve <=>
sayısal karşılaştırma için), skaler sanki bir sayıymış gibi kullanılır.
Tüm programlama için temel kural "kişiyi en az şaşırtan şeyi yapın" dır. Bu, orada sürprizlerin olmadığı anlamına gelmez, ancak çaba kişiye en az sürpriz yapmaktır.
Perl - php'nin yakın bir kuzenine giderken, bir operatörün dize veya sayısal bağlamlarda bir şey üzerinde hareket edebileceği ve davranışın insanlar için şaşırtıcı olabileceği durumlar vardır. ++
Operatör buna bir örnektir. Rakamlarda, tam olarak beklendiği gibi davranır. Bir dizge üzerinde "aa"
çalışırken, dizeyi artırır ( $foo = "aa"; $foo++; echo $foo;
yazdırır ab
). Aynı zamanda o kadar devredilir az
artırılır zaman olur ba
. Bu henüz şaşırtıcı değil.
$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
( ideone )
Bu çıktı:
3d8
3d9
3e0
4
Örtük dönüşümlerin ve aynı dizede farklı davranan operatörlerin tehlikelerine hoş geldiniz. (Kod biraz farklı blok Perl kolları - bu karar "3d8"
zaman ++
operatör uygulanır baştan sayısal bir değerdir ve gider 4
hemen ( ideone ) - bu davranışı, anlatılan perlop: Otomatik arttırma ve Otomatik eksiltme )
Şimdi, neden bir dil bir şekilde bir şey yapıyor, diğeri ise başka bir şekilde tasarımcıların tasarım düşüncelerine ulaşıyor. Perl'in felsefesi: Bunu yapmanın birden fazla yolu var - ve bu işlemlerden bazılarını yapmanın birkaç yolunu düşünebilirim. Öte yandan, Python'un PEP 20 - Python'un Zen'i (diğer şeylerin yanı sıra) şunları ifade eden bir felsefesi vardır: "Bunu yapmanın tek ve tercihen tek bir yolu olmalı."
Bu tasarım farklılıkları farklı dillere yol açmıştır. Python'da bir sayının uzunluğunu almanın bir yolu vardır. Örtük dönüşüm bu felsefeye aykırıdır.
İlgili okuma: Ruby neden Fixnum'u String'e dönüştürmüyor?
perl -e 'print length(100);'
baskılar 3.