Bunu cevap olarak göndermeyecektim, ama Xeoncross benden istedi, işte başlıyoruz:
(Sidenote: Birisi küçük kod örneğindeki işaretleme sorununu çözebilirse, bunu takdir ediyorum.)
Erik Max Francis şunu yazdı:
"Brandon J. Van Every" yazdı:
Ruby hakkında Python'dan daha iyi ne olabilir? Eminim bir şey vardır. Bu ne? Python insanlarından ziyade Ruby insanlarına bunu sormak daha anlamlı olmaz mıydı?
Birinin amaçlarına bağlı olarak olabilir veya olmayabilir - örneğin, amaçlarının Python topluluğunun "sosyolojik bir araştırmasını" içermesi durumunda, o topluluğa soru sormanın, başka bir yere koymaktan daha fazla bilgi vermeyi kanıtlaması muhtemeldir. :-). Şahsen, Dave Thomas'ın son OSCON'daki bir günlük Ruby eğitimini takip etme fırsatını memnuniyetle aldım. Sözdizimi farklılıklarının ince bir kaplamasının altında, Ruby ve Python'u inanılmaz derecede benzer buluyorum - hemen hemen herhangi bir dil kümesi arasında minimum yayılma ağacını hesaplasaydım, Python ve Ruby'nin birleşecek ilk iki yaprak olacağından eminim bir ara düğüm :-).
Tabii ki Ruby, her blok sonunda aptal "uç" yazarak (yerine sadece unindenting) arasında, yorgun olsun - ama ben de daha-aptal yazarak önlemek için alabilirim :
Python de gerektiren
bir başlangıç arasında her blok, bu yüzden neredeyse bir yıkama :-). @foo
Karşı
self.foo
veya Ruby vs Python'daki davanın daha yüksek önemi gibi diğer sözdizimi farklılıkları gerçekten de benim için önemli değil.
Diğerleri şüphesiz programlama dillerini seçtikleri bu tür meselelere dayandırıyorlar ve en sıcak tartışmaları üretiyorlar - ama bana göre bu Parkinson Yasası'nın sadece bir örneğidir (bir konu hakkındaki tartışma miktarı konuyla ters orantılıdır) gerçek önem). Önemli bulduğum bir sözdizimi farkı ve Python'un lehine - ama diğer insanlar şüphesiz tam tersini düşünecek - "parametre almayan bir işlevi nasıl çağırıyorsunuz". Python'da (C'deki gibi), bir işlevi çağırmak için her zaman "çağrı operatörü" nü uygularsınız - aradığınız nesnenin hemen sonundaki parantezleri (bu sondaki parantezlerin içinde çağrıda ilettiğiniz argümanlar gider - eğer hiçbir argüman geçirmiyorsanız, parantezler boştur). Bu, özel durumlar, istisnalar, geçici kurallar ve benzerleri olmaksızın, herhangi bir işlevin dahil edilmediği, herhangi bir işlevin dahil edilmediği, sadece nesneye yapılan bir başvuru olarak - herhangi bir bağlamda, özel durumlar, istisnalar, geçici kurallar ve benzerleri olmaksızın, sadece bir nesneden bahseder. Ruby'de (Pascal'da olduğu gibi), argümanlarla bir işlevi çağırmak için argümanları iletirsiniz (normalde parantez içinde, her zaman böyle değildir) - AMA işlev hiçbir argüman almazsa, işlevden dolaylı olarak bahsettikten sonra onu çağırır. Bu, birçok insanın beklentilerini karşılayabilir (en azından şüphesiz, daha önce programlama deneyimi Pascal ile olan veya Visual Basic gibi benzer "örtük çağrı" olan diğer diller) - ama bana göre sadece bir nesneden bahsetmek EITHER, nesneye bir referans, VEYA nesneye bir çağrı, nesnenin türüne bağlı olarak - ve sadece söz ederek nesneye bir referans alamıyorum bu durumlarda açıkça "bana bir referans verin, onu DONMAYIN!" aksi halde gerekli olmayan operatörler. Bunun işlevlerin (veya yöntemlerin veya diğer çağrılabilir nesnelerin) "birinci sınıfını" ve nesnelerin sorunsuz bir şekilde değiştirilmesi olasılığını etkilediğini hissediyorum. Bu nedenle, benim için, bu özel sözdizimi farkı Ruby'ye karşı ciddi bir kara leke - ama onlarla daha sert bir şekilde katılmıyorum olsa bile, başkalarının neden başka bir şey olacağını anlıyorum :-). Sözdiziminin altında, temel anlambilimde bazı önemli farklılıklara giriyoruz - örneğin, Ruby'deki dizeler değiştirilebilir nesnelerdir (C ++ gibi), Python ise onlar değişebilir değildir (Java gibi, ya da C # inanıyorum). Yine, öncelikle aşina olduklarına göre karar verenler, bunun Ruby için bir artı olduğunu düşünebilirler (elbette Java veya C # 'a aşina olmadıkları sürece :-). Ben, değişmez dizeleri mükemmel bir fikir olduğunu düşünüyorum (ve Java, bağımsız olarak bence, zaten Python olan bu fikri yeniden icat şaşırttı), ama ben de bir "değişebilir dize tampon" türü de sakıncası olmaz (ve ideal olarak Java'nın kendi "dize arabelleklerinden" daha iyi kullanım kolaylığı olan); ve bu yargıyı aşinalık nedeniyle vermiyorum - Java üzerinde çalışmadan önce, burada fonksiyonel programlama dilleri dışında Öncelikle aşina olduklarına göre karar veren insanlar bunun Ruby için bir artı olduğunu düşünebilirler (elbette Java veya C # 'a aşina olmadıkları sürece :-). Ben, değişmez dizeleri mükemmel bir fikir olduğunu düşünüyorum (ve Java, bağımsız olarak bence, zaten Python olan bu fikri yeniden icat şaşırttı), ama ben de bir "değişebilir dize tampon" türü de sakıncası olmaz (ve ideal olarak Java'nın kendi "dize arabelleklerinden" daha iyi kullanım kolaylığı olan); ve bu yargıyı aşinalık nedeniyle vermiyorum - Java üzerinde çalışmadan önce, burada fonksiyonel programlama dilleri dışında Öncelikle aşina olduklarına göre karar veren insanlar bunun Ruby için bir artı olduğunu düşünebilirler (elbette Java veya C # 'a aşina olmadıkları sürece :-). Ben, değişmez dizeleri mükemmel bir fikir olduğunu düşünüyorum (ve Java, bağımsız olarak bence, zaten Python olan bu fikri yeniden icat şaşırttı), ama ben de bir "değişebilir dize tampon" türü de sakıncası olmaz (ve ideal olarak Java'nın kendi "dize arabelleklerinden" daha iyi kullanım kolaylığı olan); ve bu yargıyı aşinalık nedeniyle vermiyorum - Java üzerinde çalışmadan önce, burada fonksiyonel programlama dilleri dışında Ben değişmez dizeleri mükemmel bir fikir olduğunu düşünüyorum (ve ben bağımsız olarak, bence Java, zaten Python olan bu fikri yeniden icat şaşırttı), ama ben de bir "değişebilir dize tampon" türü de (ve ideal olarak, Java'nın kendi "dizgi tamponlarından" daha iyi kullanım kolaylığı olan); ve bu yargıyı aşinalık nedeniyle vermiyorum - Java üzerinde çalışmadan önce, burada fonksiyonel programlama dilleri dışında Ben değişmez dizeleri mükemmel bir fikir olduğunu düşünüyorum (ve ben bağımsız olarak, bence Java, zaten Python olan bu fikri yeniden icat şaşırttı), ama ben de bir "değişebilir dize tampon" türü de (ve ideal olarak, Java'nın kendi "dizgi tamponlarından" daha iyi kullanım kolaylığı olan); ve bu yargıyı aşinalık nedeniyle vermiyorum - Java üzerinde çalışmadan önce, burada fonksiyonel programlama dilleri dışındatüm veriler değişmez, bildiğim tüm dillerin değişebilir dizeleri vardı - yine de Java'da değişmez dize fikrini ilk gördüğümde (Python'u öğrenmeden önce iyi öğrendim), hemen bana mükemmel geldi, çok iyi uyuyordu daha üst düzey bir programlama dilinin referans semantiği (makineye daha yakın ve C gibi uygulamalardan daha uzak dillerle en iyi uyan değer semantiklerinin aksine) birinci sınıf, yerleşik (ve güzel önemli) veri türü.
Ruby'nin temel anlambilimde bazı avantajları vardır - örneğin, Python'un "listeler ile tuples" un kaldırılması son derece ince bir ayrımdır. Ama çoğunlukla puan (ben tutmak gibi, basitlik ile büyük bir artı ve ince, akıllı ayrımlar dikkate değer bir eksi) Ruby karşıdır (örneğin, hem kapalı hem de yarı açık aralıklarla, a..b ve a gösterimleri ile .. .b [kimse hangisinin hangisinin açık olduğunu iddia etmek ister ? -)] aptalca - IMHO, tabii ki!). Yine, bir dilin özünde bir MINUS yerine bir PLUS, benzer ama kurnazca farklı şeylere sahip olmayı düşünen insanlar, elbette bunları "saymaktan" nasıl sayarım :-).
Bu karşılaştırmalarla iki dilin
çokfarklı, dikkat et. Onlar değil. Ama "capelli d'angelo" yu "spaghettini" ile karşılaştırmam istenirse, bu iki çeşit makarnanın hemen hemen herkes tarafından ayırt edilemez olduğunu ve hazırlamak isteyebileceğiniz herhangi bir yemeğin yerine geçebileceğini belirledikten sonra, kaçınılmaz olarak uzunlukların ve çapların fark edilemez bir şekilde nasıl farklılaştığı, ipliklerin uçlarının bir durumda ve diğerinde değil, nasıl sivrildiklerinin mikroskobik incelemesine geçmek için - kişisel olarak neden capelli d'yi tercih ettiğimi açıklamak için herhangi bir et suyunda makarna olarak angelo, ama makarna gibi makarnalar gibi uzun ince makarna formları (zeytinyağı, kıyılmış sarımsak, kıyılmış kırmızı biber ve ince öğütülmüş hamsi için uygun soslar ile gitmek istiyorum, örneğin - ancak sarımsak ve biberleri kıymak yerine dilimlediyseniz, spagettininin daha ince bir şekilde evrimleşmesi yerine spagetti'nin daha sağlam gövdesini seçmelisiniz ve bunun yerine yeni bir yay fesleğen eklemeniz iyi olur. hatta sapkınım! - hafif nane ...] yaprakları - yemeğe hizmet etmeden önceki son anda). Üzgünüz, yurtdışına seyahat ettiğimi ve bir süredir makarna yemediğimi gösteriyor. Ama benzetme hala oldukça iyi! -) ve iyi bir görüşme önlenmesi ve yerine bazı taze bahar fesleğen eklemek için tavsiye edilir [veya hatta - ben bir sapkın ...! - hafif nane ...] yaprakları - yemeğe hizmet etmeden önceki son anda). Üzgünüz, yurtdışına seyahat ettiğimi ve bir süredir makarna yemediğimi gösteriyor. Ama benzetme hala oldukça iyi! -) ve iyi bir görüşme önlenmesi ve yerine bazı taze bahar fesleğen eklemek için tavsiye edilir [veya hatta - ben bir sapkın ...! - hafif nane ...] yaprakları - yemeğe hizmet etmeden önceki son anda). Üzgünüz, yurtdışına seyahat ettiğimi ve bir süredir makarna yemediğimi gösteriyor. Ama benzetme hala oldukça iyi! -)
Python ve Ruby'ye geri döndüğümüzde iki büyük boyuta (dilde uygun olarak - kütüphaneleri ve araçlar ve ortamlar, her dilin nasıl gömüleceği / genişletilebileceği, vb. şimdilik - her dilin tüm UYGULAMALARI için geçerli olmazlar, örneğin, Jython vs Klasik Python, Python dilinin iki uygulamasıdır!):
Ruby'nin yineleyicileri ve kod blokları ile Python'un yineleyicileri ve jeneratörleri;
Ruby'nin TOTAL, dizginsiz "dinamikliği", tüm yerleşik sınıflar dahil olmak üzere mevcut herhangi bir sınıfı "yeniden açma" ve çalışma zamanında davranışını değiştirme - Python'un
varolan davranışını asla değiştirmeyen geniş ama sınırlı dinamikliği yerleşik sınıflar ve örnekleri.
Şahsen, 1'i bir yıkama olarak görüyorum (farklılıklar o kadar derin ki, insanların ya yaklaşımdan nefret etmesini ve diğerini geri döndürmesini kolayca görebiliyordum, ancak BENİM kişisel ölçeklerimde artıları ve eksileri neredeyse eşit olarak görebiliyorum); ve [2] çok önemli bir konu - Ruby'yi "tinkering" için çok daha uygun hale getiren bir sorun, AMA Python büyük üretim uygulamalarında kullanım için eşit derecede daha uygun. Bir bakıma komik, çünkü her iki dil de diğerlerinden çok daha dinamik, sonuçta POV'umdan aralarındaki anahtar fark buna bağlı olmalı - Ruby bu konuda "onbirine gidiyor" (referans Burada tabii ki "Spinal Tap" için). Ruby'de,Bunu yapabilirim ! Yani, yerleşik dize sınıfını dinamik olarak değiştirebilirim, böylece
a = "Merhaba Dünya"
b = "merhaba dünya"
== b ise
"eşittir! \ n" yazdır
Başka
"farklı! \ n" yazdır
son
"Eşit" yazdırır. Python'da bunu yapmanın bir yolu yok. Metaprogramlama, deneysel çerçevelerin uygulanması ve benzeri amaçlar için, Ruby'nin bu şaşırtıcı dinamik yeteneği son derece
çekici. AMA - geniş çaplı uygulamalardan bahsediyorsak, birçok insan tarafından geliştirilmiş ve farklı kaynaklardan her türlü kütüphane de dahil olmak üzere daha da fazlası tarafından korunuyor ve müşteri sitelerinde üretime girmeye ihtiyaç duyuyorsak ... çok dinamik bir dil, çok teşekkür ederim. Bazı kütüphanelerin farkında olmadan, bu dizelere farklı olan diğer ilgisiz olanları kırma fikrinden nefret ediyorum - bu, LOOK'un ayrı olması ve ayrı olması gereken kod parçaları arasında derin ve derinden gizlenmiş bir "kanal" türü büyük ölçekli programlama. Herhangi bir modülün diğer "davranışlarını" davranışını etkilemesine izin vererek,
Ruby'yi bu kadar büyük bir uygulama için kullanmak zorunda kalsaydım, kodlama stili kısıtlamalarına, birçok teste (HERHANGİ bir değişiklik olduğunda yeniden çalıştırılmak için - tamamen ilgisiz olması gerekse ...) ve benzerlerine güvenmeye çalışırdım, bu dil özelliğinin kullanılmasını yasaklamak için. Ancak ilk etapta bu özelliğe sahip OLMAMAK daha iyi, bence - Python'un belirli bir sayıda yerleşik "çivilenmiş" olabilmesi durumunda uygulama programlaması için daha iyi bir dil olması gibi, bu yüzden örneğin,
len("ciao")
4'tür (daha doğrusu birileri adının bağlayıcı değişti olmadığı konusunda endişe subliminally zorunda kalmak yerine len
içinde __builtins__
... modül). Umarım sonunda Python yerleşiklerini "çivi" yapar.
Ancak sorun önemsizdir, çünkü yerleşik isimleri yeniden hatırlamak Python'da oldukça yaygın değildir ve nadir bir uygulamadır. Ruby'de, bana büyük gibi geliyor - tıpkı
diğer dillerin (örneğin Dylan gibi) çok güçlü makro tesislerinin kendi düşüncemde benzer riskler sunması gibi (Python'un asla bu kadar güçlü bir makro sistemi almamasını umuyorum, hayır "insanların dilin içine yerleştirilmiş kendi alan adına özgü küçük dillerini tanımlamasına izin verme" cazibesi - IMHO, Python'un uygulama programlaması için harika yararlılığını bozacak ve her programcının kalbinde gizlenir ...).
Alex