Ruby neden Python'dan daha çok Rails için uygundur? [kapalı]


90

Python ve Ruby genellikle benzer ifade ve güce sahip yakın kuzenler (oldukça farklı tarihsel bagajlarla birlikte) olarak kabul edilir. Ancak bazıları, Rails çerçevesinin muazzam başarısının, üzerine inşa edildiği dil ile gerçekten büyük bir ilgisi olduğunu savundu: Ruby'nin kendisi. Öyleyse neden Ruby böyle bir çerçeve için Python'dan daha uygun olsun?


44
İtiraz. _
Jimmy

75
"Python on
Pails"

105
@Ephemient: Uçaklarda Python olacağına inanıyorum.
Jimmy

37
@ Jimmy: Uçağa kimin ihtiyacı var? yerçekimine karşı ithalat ;-) xkcd.com/353
Vinay Sajip

157
Hapishanelerde Java var mı?
Nosredna

Yanıtlar:


170

Muhtemelen iki büyük fark vardır:

Ruby'nin zarif, anonim kapanışları vardır.

Raylar bunları iyi bir etki için kullanır. İşte bir örnek:

class WeblogController < ActionController::Base
  def index
    @posts = Post.find :all
    respond_to do |format|
      format.html
      format.xml { render :xml => @posts.to_xml }
      format.rss { render :action => "feed.rxml" }
    end
  end
end

Anonim kapatmalar / lambdalar, blokları alacak yeni dil özelliklerini taklit etmeyi kolaylaştırır. Python'da kapatmalar vardır, ancak kullanılmaları için adlandırılmaları gerekir. Dolayısıyla, yeni dil özelliklerini taklit etmek için kapanışları kullanabilmek yerine, bir kapanış kullandığınızı açıkça belirtmek zorundasınız.

Ruby daha temiz ve kullanımı daha kolay meta programlamaya sahiptir.

Bu, öncelikle kullanımının ne kadar kolay olduğu nedeniyle Rails'te yaygın olarak kullanılır. Daha spesifik olmak gerekirse, Ruby'de sınıf bağlamında rastgele kod çalıştırabilirsiniz. Aşağıdaki parçacıklar eşdeğerdir:

class Foo
  def self.make_hello_method
    class_eval do
      def hello
        puts "HELLO"
      end
    end
  end
end

class Bar < Foo # snippet 1
  make_hello_method
end

class Bar < Foo; end # snippet 2
Bar.make_hello_method

Her iki durumda da şunları yapabilirsiniz:

Bar.new.hello  

"MERHABA" yazdıracak. class_evalO anında yöntemleri oluşturmak mümkündür böylece bir sınıf oluşturulurken olarak yöntem ayrıca, bir String alır içinde geçirilen parametrelere dayalı anlambilimini farklı bildirildi.

Aslında, Python'da (ve diğer dillerde de) bu tür bir meta programlamayı yapmak mümkündür, ancak Ruby'nin bir ayağı vardır çünkü meta programlama özel bir programlama tarzı değildir. Ruby'de her şeyin bir nesne olduğu ve tüm kod satırlarının doğrudan çalıştırıldığı gerçeğinden kaynaklanır. Sonuç olarak, Classes kendileri nesnelerdir, sınıf gövdeleri selfSınıfı işaret eder ve bir tane oluştururken sınıfta yöntemler çağırabilirsiniz.

Bu, Rails'de mümkün olan bildirimsellik derecesinden ve anahtar kelimeler veya yeni blok dil özellikleri gibi görünen yeni bildirimsel özellikleri uygulayabilmemizin kolaylığından büyük ölçüde sorumludur.


40
Python'da her şey nesnedir ve tüm kod satırları da doğrudan çalıştırılır. ;) Ancak, sınıf gövdesindeki sınıfa işaret eden, sınıf tanımından sonrasına kadar yaratılmayan bir "benliğiniz" yok, bu yüzden bu kodu daha sonra Python'a koymanız gerekir ki bu kuşkusuz daha az zariftir. ama işlevsel olarak eşdeğer.
Lennart Regebro

31
@lennart işte bu nokta. Python, adlandırılmış lambdalar, dekoratörler ve sınıflar oluşturulduktan sonra kod ekleyerek aynı tür şeyleri yapmanıza izin verir, ancak zarafet kaybı hızla artar ve Rails gibi bir şeyi son kullanıcılar için fark edilir şekilde daha zor veya fark edilir derecede daha az zarif hale getirir.
Yehuda Katz

9
Bana gerçekten büyük farklılıklar gibi görünmüyorlar.
Dietrich Epp

10
@lennart Biraz kafam karıştı. Bunlara Python'da ihtiyacınız olmadığını söyledim - ancak bunlara sahip olmamanız, kodu son kullanıcılar için (biri veya diğeri) uygulamayı zorlaştırdı veya daha az zarif hale getirdi. Diller tamamlanıyor - isterseniz C dilinde Rails yazabilirsiniz.
Yehuda Katz

5
@lennart Şimdi öznel bölgeye giriyoruz, ancak bahsettiğim iki özellik, bildirimsel ve yordamsal programlama karışımıyla çerçeveler üretirken oldukça kullanışlıdır. Anonim lambdaların olmaması, özellikle Python'un ifade gücü sınırlamasıdır. Tutarlılık eksikliği (yalnızca sınıflar oluşturulduktan SONRA oluşturulan sınıflarla çalışma ihtiyacı) da oldukça sınırlayıcıdır.
Yehuda Katz

58

Bunu tartışanlar

Rails çerçevesinin muazzam başarısının, üzerine inşa edildiği dille gerçekten büyük bir ilgisi var

(IMO) yanılıyor. Bu başarı muhtemelen herhangi bir teknik beceriden çok akıllı ve sürekli pazarlamaya borçludur. Django , Ruby'nin herhangi bir özelliğine ihtiyaç duymadan pek çok alanda (örn. Yerleşik mükemmel yönetici) tartışmasız daha iyi bir iş çıkarır. Ruby'ye hiç laf atmıyorum, sadece Python'u savunuyorum!


10
Eh, burada öznel bölgeye giriyoruz. Yöneticinin "yalnızca" olduğunu düşünüyorsanız, bunun nedeni, sağladığı zaman kazandıran avantajlardan yararlanmamış olmanız olabilir. Ruby'nin sahip olduğu ve Python'un sahip olmadığı özellikler nedeniyle Django'nun Rails'den daha kötü olduğunu düşündüğünüz alanlar var mı? Asıl mesele hangi çerçevenin daha iyi olduğu ile ilgili değil - bu (bu sorunun başka bir yerinde belirtildiği gibi) Python'da eksik olan bir şey olup olmadığı, bu da onu bir kick-ass framework geliştirmeyi daha az yetenekli kılıyor. Kanıtlara göre böyle bir eksiklik yok.
Vinay Sajip

18
@ Olumsuz oy verenler için: Gerçekten umrumda değil, ama neden cevabımın yardımcı olmadığını düşündüğünü merak ediyorum . Birinin olumsuz oy verdiğini fark etmemiştim çünkü biri birinin pozisyonuna katılmıyordu - genellikle sadece bir sorunun veya cevabın bir şekilde işleri daha da kötüleştirdiğini hissettiğim durumlarda olumsuz oy vermiştim.
Vinay Sajip

5
Kendi admin bölümümü yazabilirim, buna ihtiyacım yok çerçevede. Başvurumu yazmayı kolaylaştırmanın başka yollarını tercih ederim.
nitecoder

8
@railsninja: Aferin sana. Çoğu sistemin ihtiyaç duyduğu yönetici temizlik işleri için standart sayfalar yazmak zorunda kalmamayı tercih ederim. Son zamanlarda, yerel bir hayır kurumu web sitesi için bazı pro-bono çalışmalar yaptım ve Django yöneticisi denklemin bir parçası olmasaydı bu siteyi yapmak hiç mümkün olmazdı. Olduğu gibi, son kullanıcılar için oldukça özelleştirilmiş bir Ajaxified UI'ye sahip bir site sağladım, ancak arka uç yöneticileri, yönetici ile çalıştı ve ihtiyaçları için fazlasıyla yeterliydi.
Vinay Sajip

6
@Matt: Onun sorusu Ruby'nin neden Python'dan DAHA uygun olduğudur .. Ve cevap, doğrusu öyle değil.
Lennart Regebro

54

Python topluluğu, işleri mümkün olan en basit ve basit şekilde yapmanın en yüksek zarafet biçimi olduğuna inanır. Ruby topluluğu, işleri havalı koda izin verecek şekilde akıllıca yapmanın en yüksek zarafet biçimi olduğuna inanıyor.

Rails, belirli kuralları izlerseniz, sizin için sihirli bir şekilde başka pek çok şey olur. Bu, dünyaya yakut bakış açısıyla gerçekten iyi bakıyor, ancak piton yolunu gerçekten takip etmiyor.


4
Elbette, ama şifreli tek satırlıkların havalı olduğunu düşünen Perl'lerde kayıplar var (pek çok değil ) ve bunun tek gerçek dil olduğuna yemin eden birçok Lisp'liler var. Kesinlikle teknenizi yüzen bölgedeyiz.
Vinay Sajip

4
Rayların sihri sıfırdır, tam orada kaynaktadır. Nasıl olduğunu bilmek istiyorsan, kıçından kalk ve öğren.
nitecoder

21
"Yeterince gelişmiş herhangi bir teknoloji sihirden ayırt edilemez." - Arthur
C.Clarke

1
"sihir", çerçevenin doğrudan sorulmadan sizin için çok şey yaptığı anlamına gelir. Yine, değer yargılarında bulunmuyorum, iyi ve kötü tarafları olan şeyler yapmanın bir tarzıdır. Şahsen, raylarda harika çalıştığını düşünüyorum.
Matt Briggs

2
Zarafet ve gelenekler sihri ifade etmez.
BJ Clark

26

Bu tartışma yeni bir "vim ve emacs" tartışması mı?

Ben bir Python / Django programcısıyım ve şimdiye kadar bu dilde / çerçevede beni Ruby / Rails'e geçmeye götürecek bir sorun bulamadım.

Ruby / Rails ile tecrübeli olsaydım da aynı olacağını hayal edebiliyorum.

Her ikisinin de benzer felsefeleri var ve işi hızlı ve zarif bir şekilde yapıyorlar. Daha iyi seçim, zaten bildiğiniz şeydir.


25

Şahsen, Ruby'nin python'dan daha üstün olduğunu düşünüyorum, bu da benim 'tutarlı ifade gücü' dediğim şeyi içerir. Örneğin, ruby'de join, dizi nesnesi üzerinde bir dize çıkaran bir yöntemdir, bu nedenle şuna benzer bir şey elde edersiniz:

numlist = [1,2,3,4]
#=> [1, 2, 3, 4]
numlist.join(',')
#=> "1,2,3,4"

Python'da, birleştirme, dizge nesnesi üzerinde bir yöntemdir, ancak birleştirilecek şey olarak bir dizeden başka bir şey iletirseniz bir hata atar, dolayısıyla aynı yapı şunun gibi bir şeydir:

numlist = [1,2,3,4]
numlist
#=> [1, 2, 3, 4]
",".join([str(i) for i in numlist])
#=> '1,2,3,4'

Zamanla biriken bu türden pek çok farklılık vardır.

Ayrıca, görünmez mantık hatalarını ortaya koymanın beyaz alanı önemli hale getirmekten daha iyi bir yolunu düşünemiyorum.


29
Deneyimim, boşlukları önemli kılmak mantık hatalarının ortadan kalkmasına yardımcı olmasıdır. Boşluk ve söz dizimine uymamak çok daha kafa karıştırıcı.
Nosredna

5
Başlangıcı ve bitişi olan dillerde ve parantezli dillerde ve montajda, kodun yanlış yapıştırıldığını ve daha sonra sorunlara neden olduğunu gördüm. Bu her zaman bir problemdir. İnsanların Python'u kötü bir şekilde yapıştırmasıyla ilgili çok sorun yaşadınız mı?
Nosredna

5
Python'da boşluk önemli değildir: secnetix.de/~olli/Python/block_indentation.hawk . Python'da girintileme nedeniyle "görünmez hatalar" ortaya çıkarmak neredeyse imkansızdır (editör ayarlarınızı değiştirmelisiniz) ve tabii ki başka herhangi bir dilde girintilemeden kaynaklanan görünmez hataları basitçe yanlış girinti yaparak ortaya çıkarmak tamamen mümkündür. @fields: O halde kodu skype veya HTML yoluyla kopyalamayın. Tanrım.
Lennart Regebro

7
Bir Join'teki gibi dizelere dizge olmayanlar eklemeye çalışırsanız Python'un şikayet etmesi doğrudur. Bunun nedeni açıklığın örtükten daha iyi olmasıdır. Python'da çok az otomatik dönüşüm vardır ve bunun nedeni, özellikle dinamik dillerde sorunlara yol açma eğiliminde olmalarıdır, çünkü işler beklediğiniz türden değildir. Elbette "" .join () yöntemi başlangıçta geriye doğru geliyor, ama nedeni bu. Listede aslında bir anlam ifade etmiyor ...
Lennart Regebro

8
Yüce Tanrım ... Statik olarak yazılmış demek istiyorsun, kuvvetle yazılmış değil. Python güçlü bir şekilde yazılmıştır, Ruby de öyle: stackoverflow.com/questions/520228/… Ruby'de de bir tamsayıya dize ekleyemezsiniz. Seni düzeltmekten yoruldum, lütfen ileride cevap vermeden önce gerçeklerini kontrol et.
Lennart Regebro

15

Gerçek cevap, ne Python ne de Ruby bir web çerçevesi için daha iyi / daha kötü adaylar değildir. Tarafsızlık istiyorsanız, her ikisine de biraz kod yazmanız ve topluluk da dahil olmak üzere kişisel tercihinize en uygun olanı görmeniz gerekir.

Birini veya diğerini savunan çoğu insan ya diğer dili hiç ciddi bir şekilde kullanmamış ya da kişisel tercihleri ​​için 'oy veriyor'.

Sanırım çoğu insan hangisiyle ilk temasa geçerse karar verir, çünkü bu onlara yeni bir şey öğretir (MVC, test etme, üreteçler vb.) Veya daha iyi bir şey yapar (eklentiler, şablon oluşturma vb.). PHP ile geliştirme yapıyordum ve RubyOnRails ile iletişime geçtim. Rails'i bulmadan önce MVC hakkında bilgi sahibi olsaydım, PHP'yi muhtemelen geride bırakmazdım. Ama Ruby kullanmaya başladığımda sözdizimi, özellikler vb. Hoşuma gitti.

Python'u ve MVC çerçevelerinden birini ilk olarak bulmuş olsaydım, bunun yerine büyük olasılıkla o dili övüyor olurdum!


11

Python'da çok sayıda Rails benzeri çerçeve bulunur. O kadar çok şaka var ki, PyCon'daki tipik konuşma sırasında en az bir web çerçevesi ışığı görecek.

Rubys meta programlamasının onu daha uygun hale getireceği argümanı IMO yanlıştır. Bunun gibi çerçeveler için meta programlamaya ihtiyacınız yok.

Bu bakımdan Ruby'nin Python'dan daha iyi (ve muhtemelen ne de daha kötü) olmadığı sonucuna varabileceğimizi düşünüyorum.


8

Çünkü Rails, Rubys özellik setinden yararlanmak için geliştirilmiştir.

Benzer şekilde akılsız bir soru da "Python Django için Ruby'den neden daha uygun?" Olabilir.


4

Sanırım kendi başına dil özelliklerini değil, ilgili toplulukların dil özellikleri üzerinde yaptıkları aksanları tartışmalıyız . Örneğin, Python'da bir sınıfı yeniden açmak tamamen mümkündür, ancak bu yaygın değildir; Ruby'de, ancak, bir sınıfı yeniden açmak günlük alıştırmanın bir parçasıdır. bu, çerçevenin mevcut gereksinime göre hızlı ve basit bir şekilde özelleştirilmesine izin verir ve Ruby'yi Rails benzeri çerçeveler için diğer dinamik dillerden daha uygun hale getirir. Dolayısıyla cevabım: sınıfları yeniden açmanın ortak kullanımı.


1

Bazıları, ActiveRecord'u (rayların temel bileşenlerinden biri) mümkün kılmak için gereken metaprogramlama türünün Ruby'de yapmanın python'dan daha kolay ve daha doğal olduğunu söyledi - henüz python bilmiyorum;), bu yüzden bu ifadeyi kişisel olarak doğrulayamam.

Rayları kısaca kullandım ve yakalama / durdurma ve dinamik değerlendirme / kod enjeksiyonu kullanımı, diğer çerçevelerin bazılarından (zamanından önce) çok daha yüksek bir soyutlama seviyesinde çalışmanıza izin veriyor. Python'un çerçevesi ile ilgili çok az deneyimim var veya hiç deneyimim yok - ama aynı derecede yetenekli olduğunu duydum - ve python topluluğunun pitonik çabaları desteklemek ve teşvik etmek için harika bir iş çıkardığını duydum.


3
Aslında, bu tür bir "sihir" Python'da genellikle hoş karşılanmaz; örneğin, code.djangoproject.com/wiki/RemovingTheMagic
ephemient

2
Bence "sihir" adına "sihir" (meta programlama hileleri) her zaman kaşlarını çatılmalıdır - daha basit kod, ancak eşit derecede güçlü ve anlamlı olan her zaman kazanmalıdır - ancak tam işlevselliği ve sözdizimini sağlamanın tek yolunun olduğu durumlar vardır İstediğiniz "sihir" gerektirir - ve bu durumlarda "sihir" vazgeçilmezdir;)
Faisal Vali

1

Sözdiziminin daha temiz olduğunu ve Ruby'nin, en azından benim için çok daha "eğlenceli" olduğunu düşünüyorum - bu kadar öznel!


-1

İki cevap:

a. Çünkü raylar Ruby için yazılmıştır.

b. Aynı nedenle C, Linux için Ruby'den daha uygundur


Soru cevabının bağlamı göz önüne alındığında kesinlikle hiçbir anlam ifade etmiyor.
lorefnon

-6

Bunların hepsi TAMAMEN "IMHO"

Ruby'de BİR web uygulaması çerçevesi vardır, bu nedenle o dil için reklamı yapılan tek çerçevedir.

Python, başlangıcından bu yana birkaç tanesine sahipti: Zope, Twisted, Django, TurboGears (kendisi diğer çerçeve bileşenlerinin bir karışımı), Pylons (Rails çerçevesinin bir tür klonu) vb. Hiçbiri python topluluğu çapında "kullanılacak olan" olarak desteklenmez, bu nedenle tüm "zemin dalgası" birkaç projeye yayılır.

Rails, yalnızca veya en azından büyük çoğunluğu Rails sayesinde topluluk boyutuna sahiptir.

Hem Python hem de Ruby, işi bir web uygulamaları çerçevesi olarak mükemmel bir şekilde yapabilir. SİZİN (ve potansiyel geliştirme ekibinizin) beğendiği ve uyum sağlayabileceğiniz birini kullanın.


7
ruby'nin birden fazla web uygulama çerçevesi vardır: Nitro, Merb, Camping .. bunlardan birkaçı
Corban Brook

5
Ekleme: Sinatra ve hatta çok hızlı, çok minimal web uygulamaları için bir çıplak Rack uygulaması.
Kris

2
-1 "Ruby'de TEK bir web uygulaması çerçevesi vardır" yanlış bir ifade için çok kategoriktir. Nitro, Merb, Camping, Sinatra
Maximiliano Guzman

2
Her iki tarafın da bilgisiz fikirleri, tüm bunları çözmeye çalışan yeni gelenler için tam anlamıyla kafa karışıklığının nedenidir. Aynı zamanda, daha iyi bilselerdi gerçekten takdir edecekleri bir şeyi kaçırabilecekleri anlamına da gelir.
Walt Jones

3
Bence onun düşüncesi, Rails'in Ruby topluluğunda Django'nun Python topluluğundan daha büyük bir zihin paylaşımına sahip olmasıydı, bu geçerli
pjb3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.