Baidu Encyclopedia, Julia'yı bilimsel bilgi işlem için yüksek performanslı, dinamik, üst düzey bir programlama dili olarak tanımlar. Julia'nın bilimsel hesaplama ve yapay zeka alanlarında büyük avantajları olduğu ve bu iki alanın artık en ateşli alanlar olduğu anlamına geliyor. Yani Julia'yı öğrenme ümidi hala iyi.
Herhangi bir dildeki değişkenlerin kapsamını anlamak çok basit ve çok önemlidir. Julia'nın kapsamı, iyi bildiğiniz diğer dillerle aynı mı?
Julia1.0 değişkenlerin kapsamında nispeten büyük değişiklikler yaptı. Bu makale sadece Julia1.0'daki değişkenlerin kapsamına odaklanıyor.
Tartışmak istediğimiz sorun aşağıdaki kodla ilgilidir:
Yukarıdaki kod çalıştırılırsa, a ve b'nin değerlerine ne olacak? Anladığınızla aynı olup olmadığını görmek için önce kendiniz deneyebilirsiniz.
Cevap: Bu kod func_a () çalıştırılırken bir istisna atar: HATA: UndefVarError: b tanımlı değil, diğer bir deyişle kod sorunlu.
Önce func_b'yi analiz edelim, sonra func_a'yı analiz edelim, sonra özetleyelim ve son olarak iki küçük soru atalım. İlgilenen arkadaşlar bunu deneyebilir ve düşünebilir ve ardından yorum alanında cevabınızı söyleyebilir. Herkesi iletişim kurmaya teşvik ederim.
Not: Açıklama kolaylığı açısından, aşağıdaki kodun REPL'de yürütüldüğünü, yani global değişkenlerin Main modülüne ait olduğunu varsayıyoruz.
Anlayışımız (elbette şimdi yanlış olduğunu kanıtladı):
B + = 100 için, anlayışımız b = Ana.b + 100'e eşdeğerdir.
Sağdaki Main.b, 1 olan global değişken b olmalıdır. Değişkenler, bir modülde global bir değişken olduğunu belirten bir modül ön ekine sahiptir ; Soldaki b fonksiyona atandığından yerel bir değişken olmalıdır. Son olarak, func_b () işlemi 101 döndürmelidir ve Main.b değişmeyecek, hala 1'dir.
Gerçek durum:
Julia'nın bunu nasıl ele aldığını net bir şekilde görmeliyiz, Julia'nın bize sağladığı araçları kullanmalıyız, burada kullandığımız @code_lowered Bir CodeInfo nesnesi oluşturan makro, Julia'nın bir ifadeyi nasıl işlediğini görmemize yardımcı olur.
% 1 geçici bir değişken olarak kabul edilebilir, bu durumda yukarıdaki CodeInfo ifadesinin anlamı b = b + 100 olur ve sonra% 1 döndürür. Burada b'nin herhangi bir öneki yoktur, bu da sol ve sağdaki b'nin yerel değişkenler olduğunu gösterir. O zaman belli ki b + 100 yanlış, Çünkü b burada tanımsızdır ve ilk önce kullanılır.
Bizim anlayışımız:
a. + = 100, a = Ana.a. + 100'e eşdeğerdir. ". +" bir yayın işlemidir, yani Main.a'daki her öğeye 100 eklemek demektir. Sonunda yerel bir değişken a'ya bir değer atayın ve dönün, Main.a değişikliği bulamayacaktır.
Gerçek durum:
Yukarıdaki Kod Bilgisi şu şekilde ifade edilebilir:
materyalize! (Ana.a, yayınlandı (Ana: +, Ana.a, 100))yayınlanan (Ana.: +, Ana.a, 100) Ana.a. + 100'dür.
Ve materyalize! (), Yukarıdaki. + İşleminin sonucunun doğrudan Main.a'yı kapsadığı anlamına gelir. İşlev adının sonunda "!" Olduğuna dikkat edin. Julia'da bu tür bir işlevi çağırmak genellikle orijinal parametreleri değiştirir.
Nihai sonuç, func_a () fonksiyonunda, a. + = 100'ün Main.a = Main.a. + 100'e eşdeğer olmasıdır, yani global değişken a şu şekilde değiştirilecektir:
Julia'da:
Değişmez nesneler için davranış func_b () ile benzerdir.
Değişebilir nesneler için davranış, func_a () 'ya benzer.
"Julia İpler Değişebilir mi yoksa Değişmez mi? "Julai'deki dizenin değiştirilebileceğinden bahsetmiştim, ancak unutmayın ki Julia hala dizeleri değişmez nesneler olarak görüyor .
Soru 1: func_a aşağıdaki gibi yeniden yazılırsa ne olur?
function func_a () a = a. + 100 sonSoru 2: func_b () 'nin global değişken b'yi değiştirmesini istersem, func_b () nasıl yazmalı?