eğer ifadeler Ruby 1.9'da kapsam sunmuyorsa, yakut 1.8'deki bu değişikliğin arkasındaki mantık nedir?
eğer ifadeler Ruby 1.9'da kapsam sunmuyorsa, yakut 1.8'deki bu değişikliğin arkasındaki mantık nedir?
Yanıtlar:
Bunun Ruby 1.9'da yapılmasının iki nedeni aşağıdaki slaytlardadır, ancak sunum yapan kişinin iletişim kutusu olmadan açık olmayabilir. Kapsam if
ifadelerinin yapmanıza izin verdiği iki şey, kaynak kodunuzda if ifadesinin dışında erişilebilen şeyleri tanımlamaktır.
İlk örnek: Yöntemleri değiştirin
class Employee
if String.method_defined?(:encode)
def name
...
end
else
def name
...
end
end
end
Bu örnekte, yöntem için iki farklı tanım vardır name
. Biri String.encode
yöntem varsa kullanılacak ve bir (alt uygulama) kodlama yöntemi yoksa kullanılacaktır. Temel olarak, bu, kütüphaneler destekliyorsa doğru kodlanmış bir dize kullanmanızı sağlar.
İkinci örnek: Uygulamayı değiştirin
if String.method_defined?(:encode)
module Builder
...
end
else
class String
...
end
end
Bu örnekte, bir kütüphane özelliğinin bulunup bulunmamasına bağlı olarak tamamen farklı bir sınıf / modül sağlıyoruz. Bu, yeni bir kütüphane özelliği kullanan tamamen farklı bir algoritmaya sahip olmanıza izin verirken, hala yoksa daha az verimli veya tam bir algoritmaya geri döner.
Hepsi önemli neden
Peki bu size ne alıyor? İfade if
yeni bir kapsam getirmişse, yeni yöntem veya sınıf yalnızca if
ifadenin sınırları dahilinde var olur ve kullanılır . Bu kısıtlama, gelecekte 1.9'dan uzaklaşacağımız için Ruby 2.0 için değişikliklere ihtiyaç duyacak bir kütüphaneyi desteklemeyi çok zorlaştırıyor.
Bağlandığınız sunuda sağlanan her iki örnekte de, akıl yürütme, Ruby'nin birden çok sürümünü desteklerken kütüphaneleriniz için bir kod tabanı korumaktır. Ruby 1.8 ve Ruby 1.9 arasında geçiş acısından doğduğuna inanıyorum. Ruby ekibi sürekli olarak 2.0'a doğru yürüdüğünden, uyumsuz değişiklikler olduğunda kullanıcılarınızı desteklemeye devam edebileceksiniz. 1.9.1 ila 1.9.2 arasında olduğuna inanıyorum. Gelecekte daha fazlası olacak.
Ben uzman değilim, ama burada Ruby SSS bölümüne bakarsanız: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php
Bölüm 2.3 "Yerel bir değişken ne zaman erişilebilir hale gelir?" geçerli davranışı gösterir.
Kapsam belirleme sorununu aşmak için, şu anda yapmanız gereken biraz "hileli" şeylerden biri:
Yerel değişkenlerin bu tür davranışlarından rahatsız olmamaları için yerel bir değişkene erişmeden önce a = nil gibi bir atama ifadesi koymanız önerilir.
Ben inanıyorum 1.9 Bunu yapmak gereğini kaldırır, ve bu yeni davranış için sürücülerin biri olabileceği.