uyumsuz türler: int, boole değerine dönüştürülemez
C'nin neden izin vermediğini ve java'nın izin vermediğini düşünüyorum. Bu nedenle, dilin tür sistemine, özellikle de sağlamlığına ilgi duyuyorum.
Sorunuz için iki bölüm var:
Java neden dönüştürmüyor? int
için boolean
?
Bu, Java'nın mümkün olduğu kadar açık olması amaçlanmasına neden oluyor. Tip sistemiyle çok statik, çok “yüzünüzde”. Diğer dillerde otomatik olarak yazılan şeyler Java'da değildir. Sen de yazmalısın int a=(int)0.5
. Bilgi dönüştürme float
, int
bilgi kaybına neden olur; dönüştürme ile aynıint
için boolean
ve bu şekilde hataya eğilimli olacaktır. Ayrıca, birçok kombinasyon belirtmek zorunda kalacaklardı. Tabii ki, bu şeyler açık gözüküyor, ancak dikkatli olmak istiyorlar.
Oh, ve diğer dillere kıyasla, Java derece oldu sadece bytecode sadece bir dahili uygulama detayı olmadığı için, tarifnamesinde kesindi. Her türlü etkileşimi kesin olarak belirtmeleri gerekirdi. Büyük girişim.
Neden if
başka tipler kabul etmiyorboolean
?
if
dışında diğer tiplere izin verecek şekilde kusursuz olarak tanımlanabilir boolean
. Aşağıdakilerin eşdeğer olduğunu söyleyen bir tanımı olabilir:
true
int != 0
String
ile .length>0
- Diğer olmayan
null
(ve Boolean
değeri olmayan) bir nesne başvurusu false
.
- Veya hatta: olmayan
null
ve onun yöntemi Object.check_if
(sadece bu vesileyle benim tarafımdan icat edilmiş) geri dönen başka herhangi bir nesne referansı true
.
Yapmadılar; gerçek bir ihtiyaç yoktu ve mümkün olduğunca sağlam, statik, şeffaf, okunması kolay vb. olmasını istediler. Örtük özellikler yok. Ayrıca, uygulama oldukça karmaşık olurdu, eminim, tüm olası durumlar için her bir değeri test etmek zorunda kaldım, bu yüzden performans da küçük bir faktör oynayabilirdi (Java o günün bilgisayarlarında sloooowdu; ilk sürümleri olan JIT derleyicileri değildi, en azından o zaman kullandığım bilgisayarlarda).
Daha derin nedeni
Daha derin bir sebep, Java'nın ilkel türlerine sahip olması olabilir, bu nedenle tür sistemi nesneler ve ilkel öğeler arasında parçalanır. Belki, onlardan uzak dursaydı, işler başka bir şekilde ortaya çıkardı. Önceki bölümde verilen kurallarla, her ilkel ilkenin doğruluğunu açıkça tanımlamak zorunda kalacaklardı (çünkü ilkeller süper bir sınıfı paylaşmazlar ve null
ilkeller için iyi bir tanım yoktur ). Bu hızla bir kabusa dönüşürdü.
Görünüm
Sonunda, belki de sadece dil tasarımcılarının tercihi. Her dilin kendi yolunda döndüğü görülüyor ...
Örneğin, Ruby'nin ilkel türleri yoktur. Her şey, kelimenin tam anlamıyla her şey bir nesnedir. Her nesnenin belirli bir yöntemi olduğundan emin olmak için çok kolay zamanları vardır.
Ruby, üzerine atabileceğiniz her türlü nesne üzerinde doğruluk arar. İlginçtir ki, hala bir boolean
tipi yoktur (çünkü ilkelleri yoktur) ve onun da Boolean
sınıfı yoktur . Değerin hangi sınıfa true
sahip olduğunu sorarsanız (kolayca kullanılabilir true.class
), elde edersiniz TrueClass
. Bu sınıf aslında, booleanlar ( | & ^ ==
) için 4 işleç gibi yöntemlere sahiptir . Burada, if
değeri falsey olarak kabul edilir ve sadece ya false
da nil
( null
Ruby) ise. Her şey doğrudur. Yani, 0
ya ""
da her ikisi de doğrudur.
Object#truthy?
Herhangi bir sınıf için uygulanabilecek ve bireysel bir gerçeği geri döndürebilecekleri bir yöntem oluşturmaları önemsiz olurdu . Örneğin, String#truthy?
boş olmayan dizeler için doğru olması için uygulanmış olabilir ya da olmasın. Ruby, çoğu bölümde Java'nın antitezi olsa da (mixin ile dinamik ördek yazma, sınıfları yeniden açma ve diğerleri) yapmadılar.
Hangi $value <> 0 || length($value)>0 || defined($value)
doğruluk için kullanılan bir Perl programcısı için şaşırtıcı olabilir . Ve bunun gibi.
null
Ne olursa olsun, herhangi bir ifadenin içinde otomatik olarak onu yanlış yapan kuralına göre SQL'i girin . Yani (null==null) = false
. Ruby'de (nil==nil) = true
. Mutlu zamanlar