Kimseden bahsetmediğim için yanılmış olabilirim, ama bunun nedeninin aynı zamanda parantezsiz işlevleri çağırabilmenin yakut mirası olduğu izlenimindeydim.
Arity açıkça buna katılıyor, ancak bir süreliğine kenara bırakalım ve argüman olmadan fonksiyonları kullanalım. Köşeli parantezlerin zorunlu olduğu javascript gibi bir dilde, bir işlevi bağımsız değişken olarak geçirmek ile işlevi çağırmak arasında fark yaratmak kolaydır. Sadece parantez kullandığınızda çağırırsınız.
my_function // argument
(function() {}) // argument
my_function() // function is called
(function() {})() // function is called
Gördüğünüz gibi, adlandırmak ya da adlandırmamak büyük bir fark yaratmıyor. Ancak iksir ve yakut, parantez olmadan işlevleri çağırmanıza izin verir. Bu, kişisel olarak sevdiğim bir tasarım seçimidir ancak bu yan etkiye sahiptir, sadece adı parantez olmadan kullanamazsınız, çünkü işlevi çağırmak istediğiniz anlamına gelebilir. Bunun için budur &
. Arity appart'ı bir saniyeliğine bırakırsanız, işlev adınızı önceden eklemek, &
bu işlevi döndürdüğü işlevi değil, bu işlevi açıkça bir bağımsız değişken olarak kullanmak istediğiniz anlamına gelir.
Artık anonim işlev, esas olarak bir argüman olarak kullanılması bakımından biraz farklıdır. Yine bu bir tasarım tercihi olmakla birlikte, bunun arkasındaki rasyonel, çoğunlukla yineleyiciler tarafından işlevleri argüman olarak alan işlevlerin kullanılmasıdır. Açıkçası kullanmanız gerekmez, &
çünkü bunlar zaten varsayılan olarak argümanlar olarak kabul edilir. Amaçları bu.
Şimdi son sorun bazen onları kodunuzda çağırmanız gerektiğidir, çünkü bunlar her zaman bir yineleyici tür işleviyle kullanılmaz veya bir yineleyiciyi kendiniz kodluyor olabilirsiniz. Küçük hikaye için, yakut nesne yönelimli olduğundan, bunu yapmanın ana yolu call
, nesneyi yöntemi kullanmaktı . Bu şekilde, zorunlu olmayan parantez davranışını tutarlı tutabilirsiniz.
my_lambda.call
my_lambda.call()
my_lambda_with_arguments.call :h2g2, 42
my_lambda_with_arguments.call(:h2g2, 42)
Şimdi birisi temelde adı olmayan bir yönteme benzeyen bir kısayol buldu.
my_lambda.()
my_lambda_with_arguments.(:h2g2, 42)
Yine, bu bir tasarım seçimidir. Şimdi iksir nesne yönelimli değildir ve bu nedenle ilk formu kesin olarak kullanmamayı çağırın. José için konuşamam ama ikinci form iksirde kullanılmış gibi görünüyor çünkü hala ekstra karakterli bir işlev çağrısı gibi görünüyor. Bir işlev çağrısına yeterince yakın.
Tüm artılarını ve eksilerini düşünmedim, ancak anonim işlevler için parantezleri zorunlu tuttuğunuz sürece her iki dilde de parantezlerden kurtulabilirsiniz. Öyle görünüyor:
Zorunlu parantezler VS Biraz farklı gösterim
Her iki durumda da bir istisna yaparsınız çünkü ikisinin de farklı davranmasını sağlarsınız. Bir fark olduğu için, bunu açık hale getirebilir ve farklı gösterime gidebilirsiniz. Zorunlu parantezler çoğu durumda doğal görünecek, ancak işler planlandığı gibi gitmediğinde çok kafa karıştırıcı olacaktır.
Hadi bakalım. Şimdi bu dünyanın en iyi açıklaması olmayabilir çünkü detayların çoğunu basitleştirdim. Ayrıca bunların çoğu tasarım seçimleridir ve onları yargılamadan onlara bir sebep vermeye çalıştım. İksiri seviyorum, yakutu seviyorum, fonksiyon çağrıları parantezsiz hoşuma gidiyor, ama sizin gibi, arada sırada sonuçları oldukça yanlış yönlendirici buluyorum.
Ve iksirde, sadece bu ekstra nokta, oysa yakutta bunun üstünde bloklar var. Bloklar şaşırtıcı ve sadece bloklarla ne kadar yapabileceğinize şaşırdım, ancak sadece son argüman olan anonim bir işleve ihtiyacınız olduğunda çalışırlar. O zaman diğer senaryolarla başa çıkabilmeniz gerektiğinden, tüm yöntem / lambda / proc / blok karışıklığı geliyor.
Her neyse ... bu kapsam dışı.