Mengapa Ruby lebih cocok untuk Rails daripada Python? [Tutup]

90

Python dan Ruby biasanya dianggap sebagai sepupu dekat (meskipun dengan bagasi sejarah yang sangat berbeda) dengan ekspresi dan kekuatan yang serupa. Tetapi beberapa orang berpendapat bahwa kesuksesan besar kerangka kerja Rails benar-benar berkaitan dengan bahasa tempatnya dibangun: Ruby itu sendiri. Jadi mengapa Ruby lebih cocok untuk kerangka seperti itu daripada Python?

Victor Yan
sumber
44
Aliterasi. _
Jimmy
75
"Python on Pails" tidak memiliki rasa yang sama ...
ephemient
105
@Ephemient: Saya yakin itu adalah Python di Planes.
Jimmy
37
@ Jimmy: Siapa yang butuh pesawat? import antigravity ;-) xkcd.com/353
Vinay Sajip
157
Apakah ada Java di Penjara?
Nosredna

Jawaban:

170

Mungkin ada dua perbedaan utama:

Ruby memiliki penutupan anonim yang elegan.

Rails menggunakannya untuk efek yang baik. Berikut contohnya:

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

Penutupan / lambda anonim membuatnya lebih mudah untuk meniru fitur bahasa baru yang akan mengambil blok. Di Python, closure ada, tapi harus diberi nama agar bisa digunakan. Jadi, alih-alih dapat menggunakan closure untuk meniru fitur bahasa baru, Anda dipaksa untuk menjelaskan fakta bahwa Anda menggunakan closure.

Ruby memiliki metaprogramming yang lebih bersih dan lebih mudah digunakan.

Ini digunakan secara ekstensif di Rails, terutama karena betapa mudahnya digunakan. Untuk lebih spesifiknya, di Ruby, Anda dapat mengeksekusi kode arbitrer dalam konteks kelas. Cuplikan berikut ini setara:

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

Dalam kedua kasus tersebut, Anda kemudian dapat melakukan:

Bar.new.hello  

yang akan mencetak "HALO". Ituclass_eval Metode juga mengambil String, jadi itu mungkin untuk menciptakan metode on the fly, sebagai kelas sedang dibuat, yang berbeda semantik berdasarkan parameter yang berlalu dalam.

Sebenarnya, dimungkinkan untuk melakukan metaprogramming semacam ini dengan Python (dan bahasa lain, juga), tetapi Ruby memiliki keunggulan karena metaprogramming bukanlah gaya pemrograman khusus. Ini mengalir dari fakta bahwa di Ruby, semuanya adalah objek dan semua baris kode dieksekusi secara langsung. Akibatnya, Classes itu sendiri adalah objek, badan kelas selfmenunjuk ke Kelas, dan Anda dapat memanggil metode pada kelas saat Anda membuatnya.

Ini sebagian besar bertanggung jawab atas tingkat deklaratifitas yang mungkin dilakukan di Rails, dan kemudahan dalam mengimplementasikan fitur deklaratif baru yang terlihat seperti kata kunci atau fitur bahasa blok baru.

Yehuda Katz
sumber
40
Di Python, semuanya adalah objek dan semua baris kode juga dieksekusi secara langsung. ;) Tapi, Anda tidak memiliki "diri" yang menunjuk ke kelas di badan kelas, yang tidak dibuat sampai setelah definisi kelas, jadi Anda harus meletakkan kode itu setelahnya dengan Python, yang diakui kurang elegan , tetapi secara fungsional setara.
Lennart Regebro
31
@ lennart itulah intinya. Python memungkinkan Anda melakukan hal yang sama dengan lambda bernama, dekorator, dan meletakkan kode setelah kelas dibuat, tetapi hilangnya keanggunan bertambah dengan cepat dan membuat sesuatu seperti Rails terasa lebih sulit untuk diterapkan atau terasa kurang elegan bagi pengguna akhir.
Yehuda Katz
9
Bagi saya, mereka tidak terlihat seperti perbedaan besar.
Dietrich Epp
10
@ lennart saya agak bingung. Saya mengatakan bahwa Anda tidak membutuhkannya dengan Python - tetapi tidak memilikinya membuat kode lebih sulit untuk diterapkan atau kurang elegan bagi pengguna akhir (satu atau yang lain). Bahasanya sudah lengkap - Anda dapat menulis Rails dalam C jika Anda mau.
Yehuda Katz
5
@lennart Sekarang kita masuk ke wilayah subyektif, tetapi dua fitur yang saya bicarakan cukup nyaman saat menghasilkan kerangka kerja dengan campuran pemrograman deklaratif dan prosedural. Kurangnya lambda anonim, khususnya, adalah batasan ekspresif Python. Kurangnya konsistensi (kebutuhan untuk bekerja dengan kelas yang dibuat hanya SETELAH kelas dibuat) juga cukup membatasi.
Yehuda Katz
58

Mereka yang membantahnya

Keberhasilan besar kerangka Rails sangat berkaitan dengan bahasa yang digunakan untuk membuatnya

adalah (IMO) salah. Keberhasilan itu mungkin lebih banyak disebabkan oleh pemasaran yang cerdas dan berkelanjutan daripada kecakapan teknis apa pun. Django bisa dibilang melakukan pekerjaan yang lebih baik di banyak area (misalnya admin kick-ass bawaan) tanpa memerlukan fitur Ruby apa pun. Saya sama sekali tidak meremehkan Ruby, hanya membela Python!

Vinay Sajip
sumber
10
Nah, kita masuk ke wilayah subjektif di sini. Jika menurut Anda admin adalah "satu-satunya", mungkin itu karena Anda tidak menikmati manfaat penghematan waktu yang diberikannya. Adakah area yang menurut Anda Django lebih buruk daripada Rails, karena fitur yang dimiliki Ruby dan Python tidak? Intinya sebenarnya bukan tentang kerangka kerja mana yang lebih baik - apakah (seperti yang ditunjukkan di tempat lain dalam pertanyaan ini) ada yang kurang dalam Python yang membuatnya kurang mampu mengembangkan kerangka kerja kick-ass. Berdasarkan bukti, tidak ada kekurangan seperti itu.
Vinay Sajip
18
@Untuk downvoters: Saya tidak terlalu keberatan, tapi saya ingin tahu mengapa Anda berpikir bahwa jawaban saya tidak membantu . Saya tidak menyadari ada yang mendapat suara negatif karena seseorang tidak setuju dengan posisi seseorang - saya biasanya hanya memberikan suara negatif ketika saya merasa bahwa pertanyaan atau jawaban entah bagaimana memperburuk keadaan.
Vinay Sajip
5
Saya bisa menulis bagian admin saya sendiri, saya tidak perlu ini dalam kerangka kerja. Saya lebih suka cara lain untuk membuat aplikasi saya lebih mudah ditulis.
nitecoder
8
@railsninja: Baik untuk Anda. Saya lebih suka tidak perlu menulis halaman boilerplate untuk pekerjaan rumah tangga admin yang dibutuhkan sebagian besar sistem. Baru-baru ini, saya melakukan beberapa pekerjaan pro-bono untuk situs web amal lokal, dan tidak mungkin untuk melakukan situs itu sama sekali jika admin Django bukan bagian dari persamaan. Karena itu, saya menyediakan situs dengan UI Ajaxified yang cukup disesuaikan untuk pengguna akhir, tetapi administrator ujung belakang bekerja dengan admin dan itu lebih dari cukup untuk kebutuhan mereka.
Vinay Sajip
6
@Matt: Pertanyaannya adalah mengapa Ruby LEBIH cocok daripada Python .. Dan jawabannya, cukup benar, adalah tidak.
Lennart Regebro
54

Komunitas python percaya bahwa melakukan sesuatu dengan cara yang paling sederhana dan mudah adalah bentuk keanggunan tertinggi. Komunitas ruby ​​percaya melakukan sesuatu dengan cara cerdas yang memungkinkan kode keren adalah bentuk keanggunan tertinggi.

Rel adalah tentang jika Anda mengikuti konvensi tertentu, banyak hal lain yang secara ajaib terjadi untuk Anda. Itu cocok dengan cara ruby ​​dalam memandang dunia, tetapi tidak benar-benar mengikuti cara python.

Matt Briggs
sumber
4
Tentu, tapi ada kehilangan orang-orang Perl (yah, mungkin tidak banyak ) yang berpikir bahwa satu-baris samar itu keren, dan banyak orang Lisp yang bersumpah bahwa itu satu-satunya bahasa yang benar. Kami pasti berada di wilayah apa pun yang mengapung-perahu Anda.
Vinay Sajip
4
Rel tidak memiliki sihir, itu ada di sumbernya. Jika Anda ingin tahu caranya, pergilah dan cari tahu.
nitecoder
21
"Setiap teknologi yang cukup maju tidak bisa dibedakan dari sihir." - Arthur C. Clarke
Vinay Sajip
1
"sihir" yang berarti kerangka melakukan banyak hal untuk Anda tanpa diminta secara langsung. Sekali lagi, saya tidak membuat penilaian nilai, ini adalah salah satu gaya melakukan hal-hal yang memiliki sisi baik dan sisi buruk. Secara pribadi, saya pikir itu bekerja dengan sangat baik di rel.
Matt Briggs
2
Keanggunan dan konvensi tidak menunjukkan sihir.
BJ Clark
26

Apakah debat ini merupakan debat baru "vim versus emacs"?

Saya seorang programmer Python / Django dan sejauh ini saya tidak pernah menemukan masalah dalam bahasa / kerangka kerja itu yang akan mengarahkan saya untuk beralih ke Ruby / Rails.

Saya dapat membayangkan bahwa itu akan sama jika saya berpengalaman dengan Ruby / Rails.

Keduanya memiliki filosofi yang sama dan melakukan pekerjaan dengan cara yang cepat dan elegan. Pilihan yang lebih baik adalah apa yang sudah Anda ketahui.

luc
sumber
25

Secara pribadi, saya menemukan ruby ​​lebih unggul dari python dalam banyak hal yang terdiri dari apa yang saya sebut 'ekspresifitas yang konsisten'. Misalnya, di ruby, join adalah metode pada objek array yang mengeluarkan string, jadi Anda mendapatkan sesuatu seperti ini:

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

Dalam python, join adalah metode pada objek string tetapi yang memunculkan kesalahan jika Anda meneruskannya selain string sebagai hal yang akan digabungkan, jadi konstruksi yang sama adalah seperti:

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

Ada banyak perbedaan kecil yang bertambah seiring waktu.

Juga, saya tidak bisa memikirkan cara yang lebih baik untuk memperkenalkan kesalahan logika yang tidak terlihat selain membuat spasi kosong menjadi signifikan.

bidang
sumber
29
Pengalaman saya adalah membuat whitespace signifikan membantu menghilangkan kesalahan logika. Jauh lebih membingungkan jika spasi dan sintaks tidak sesuai.
Nosredna
5
Dalam bahasa dengan awal dan akhir dan dalam bahasa dengan tanda kurung dan dalam perakitan, saya telah melihat kode salah ditempel dan menyebabkan masalah nanti. Itu selalu jadi masalah. Apakah Anda mengalami banyak masalah dengan orang-orang yang salah menempelkan Python?
Nosredna
5
Spasi kosong tidak signifikan dalam Python: secnetix.de/~olli/Python/block_indentation.hawk . Hampir tidak mungkin untuk memperkenalkan "kesalahan tak terlihat" karena indentasi di Python (Anda harus memalsukan pengaturan editor Anda) sementara tentu saja sangat mungkin untuk memperkenalkan kesalahan tak terlihat karena indentasi dalam bahasa lain, hanya dengan membuat indentasi yang salah. @fields: Jadi, jangan salin kode melalui skype atau HTML. Ya ampun.
Lennart Regebro
7
Benar bahwa Python mengeluh jika Anda mencoba menambahkan non-string ke string, seperti di Gabung. Ini karena eksplisit lebih baik daripada implisit. Ada sangat sedikit konversi otomatis dalam Python, dan alasannya adalah karena mereka cenderung menimbulkan masalah, terutama dalam bahasa dinamis, karena hal-hal pada akhirnya tidak seperti yang Anda harapkan. Tentu metode "" .join () memang terasa mundur pada awalnya, tapi itulah alasannya. Ini sebenarnya tidak masuk akal dalam daftar ...
Lennart Regebro
8
Tuhan Yang Maha Kuasa ... Maksudmu diketik statis, tidak diketik dengan kuat. Python sangat diketik, Begitu pula Ruby: stackoverflow.com/questions/520228/… Anda juga tidak bisa menambahkan string ke integer di Ruby. Saya bosan mengoreksi Anda, periksa fakta Anda sebelum Anda menjawab di masa mendatang.
Lennart Regebro
15

Jawaban sebenarnya adalah baik Python atau Ruby adalah kandidat yang lebih baik / lebih buruk untuk kerangka kerja web. Jika Anda menginginkan objektivitas, Anda perlu menulis beberapa kode di keduanya dan melihat mana yang paling sesuai dengan preferensi pribadi Anda, termasuk komunitas.

Kebanyakan orang yang memperdebatkan satu atau lainnya tidak pernah menggunakan bahasa lain secara serius atau 'memilih' untuk preferensi pribadi mereka.

Saya kira kebanyakan orang memutuskan dengan siapa mereka pertama kali melakukan kontak karena itu mengajarkan mereka sesuatu yang baru (MVC, pengujian, generator, dll.) Atau melakukan sesuatu yang lebih baik (plugin, templat dll). Saya biasa mengembangkan dengan PHP dan berhubungan dengan RubyOnRails. Jika saya telah mengetahui tentang MVC sebelum menemukan Rails, saya kemungkinan besar tidak akan pernah meninggalkan PHP. Tetapi begitu saya mulai menggunakan Ruby, saya menikmati sintaks, fitur, dll.

Jika saya telah menemukan Python dan salah satu kerangka MVC-nya terlebih dahulu, saya kemungkinan besar akan memuji bahasa itu!

Keris
sumber
11

Python memiliki banyak kerangka kerja mirip Rails. Ada begitu banyak lelucon sehingga selama pembicaraan umum di PyCon setidaknya satu kerangka web akan melihat cahaya.

Argumen bahwa pemrograman meta Ruby akan membuatnya lebih cocok adalah IMO salah. Anda tidak perlu metaprogramming untuk framework seperti ini.

Jadi saya pikir kita dapat menyimpulkan bahwa Ruby tidak lebih baik (dan kemungkinan tidak lebih buruk) dari Python dalam hal ini.

Lennart Regebro
sumber
8

Karena Rails dikembangkan untuk memanfaatkan set fitur Ruby.

Pertanyaan serupa yang tidak biasa adalah "Mengapa Python lebih cocok untuk Django daripada Ruby?".

Paddy3118
sumber
4

Saya kira kita seharusnya tidak membahas fitur bahasa itu sendiri, melainkan aksen yang dibuat komunitas terkait pada fitur bahasa. Misalnya, dengan Python, membuka kembali kelas sangat mungkin dilakukan tetapi tidak umum; di Ruby, bagaimanapun, membuka kembali kelas adalah sesuatu dari praktik sehari-hari. hal ini memungkinkan kustomisasi kerangka kerja yang cepat dan langsung dengan kebutuhan saat ini dan menjadikan Ruby lebih disukai untuk kerangka kerja mirip Rails daripada bahasa dinamis lainnya. Oleh karena itu jawaban saya: penggunaan umum kelas pembukaan kembali.

Giorgi
sumber
1

Beberapa orang mengatakan bahwa jenis metaprogramming yang diperlukan untuk membuat ActiveRecord (komponen kunci rel) mungkin lebih mudah dan lebih alami untuk dilakukan di ruby ​​daripada di python - Saya belum tahu python;), jadi saya pribadi tidak dapat mengkonfirmasi pernyataan ini.

Saya telah menggunakan rel secara singkat, dan penggunaan catchalls / interseptor dan evaluasi dinamis / injeksi kode memungkinkan Anda untuk beroperasi pada tingkat abstraksi yang jauh lebih tinggi daripada beberapa kerangka kerja lainnya (sebelum waktunya). Saya memiliki sedikit atau tidak ada pengalaman dengan kerangka kerja Python - tetapi saya pernah mendengarnya sama-sama mampu - dan bahwa komunitas python melakukan pekerjaan yang hebat dalam mendukung dan membina usaha pythonic.

Faisal Vali
sumber
3
Memang, "sihir" semacam ini sering tidak disukai di Python; misalnya, code.djangoproject.com/wiki/RemovingTheMagic
ephemient
2
Saya pikir "ajaib" (Metaprogramming trik) demi "ajaib" harus selalu disukai - kode sederhana, tetapi sama-sama kuat dan ekspresif, harus selalu menang - tapi ada kasus ketika satu-satunya cara untuk menyediakan tepat fungsi dan sintaks yang Anda inginkan membutuhkan "keajaiban" - dan dalam kasus tersebut, "keajaiban" sangat diperlukan;)
Faisal Vali
1

Menurut saya sintaksnya lebih bersih dan Ruby, paling tidak bagi saya, jauh lebih "menyenangkan" - sama subjektifnya dengan itu!

James Schorr
sumber
-1

Dua jawaban:

Sebuah. Karena rel ditulis untuk ruby.

b. Untuk alasan yang sama C lebih cocok untuk Linux daripada Ruby

Dhananjay Nene
sumber
Mengingat konteks jawaban pertanyaannya sama sekali tidak masuk akal.
lorefnon
-6

Semua ini BENAR-BENAR "IMHO"

Di Ruby ada SATU kerangka aplikasi web, jadi itu adalah satu-satunya kerangka kerja yang diiklankan untuk bahasa itu.

Python telah memiliki beberapa sejak awal, hanya untuk beberapa nama: Zope, Twisted, Django, TurboGears (itu sendiri merupakan campuran dari komponen kerangka kerja lainnya), Pylons (semacam tiruan dari kerangka Rails), dan seterusnya. Tak satu pun dari mereka yang didukung komunitas python-wide sebagai "THE one to use" sehingga semua "groundswell" tersebar di beberapa proyek.

Rails memiliki ukuran komunitas semata-mata, atau setidaknya sebagian besar, karena Rails.

Baik Python dan Ruby sangat mampu melakukan pekerjaan sebagai kerangka aplikasi web. Gunakan yang ANDA (dan tim pengembangan potensial Anda) suka dan dapat menyelaraskan.

Ch'marr
sumber
7
ruby memiliki beberapa kerangka aplikasi web: Nitro, Merb, Camping .. untuk beberapa nama
Corban Brook
5
Tambahkan: Sinatra dan bahkan aplikasi Rack kosong untuk aplikasi web yang sangat cepat dan sangat minimal juga.
Kris
2
-1 "Di Ruby ada SATU kerangka aplikasi web" terlalu kategoris ... untuk pernyataan palsu. Nitro, Merb, Berkemah, Sinatra
Maximiliano Guzman
2
Pendapat yang kurang informasi dari kedua sisi justru menjadi penyebab kebingungan bagi pendatang baru yang mencoba menyelesaikan semua ini. Ini juga berarti seseorang bisa kehilangan sesuatu yang sebenarnya mereka hargai jika mereka tahu lebih baik.
Walt Jones
3
Saya pikir maksudnya adalah bahwa Rails memiliki mindshare komunitas Ruby yang besar daripada yang dimiliki Django tentang komunitas Python, yang valid
pjb3