Tại sao Ruby phù hợp với Rails hơn Python? [đóng cửa]


90

Python và Ruby thường được coi là anh em họ gần gũi (mặc dù có hành trang lịch sử khá khác nhau) với biểu cảm và sức mạnh tương tự. Nhưng một số người cho rằng thành công to lớn của Rails framework thực sự có liên quan rất nhiều đến ngôn ngữ mà nó được xây dựng: chính Ruby. Vậy tại sao Ruby lại phù hợp với một framework như vậy hơn Python?


44
Phép điệp âm. _
Jimmy

75
"Python trên Pails" chỉ không có cảm giác tương tự với nó ...
ephemient

105
@Ephemient: Tôi tin rằng nó sẽ là Python trên Planes.
Jimmy

37
@Jimmy: Ai cần máy bay? chống lực hấp dẫn nhập khẩu ;-) xkcd.com/353
Vinay Sajip

157
Có Java trong Jails không?
Nosredna 09/07/09

Câu trả lời:


170

Có thể có hai điểm khác biệt chính:

Ruby có kiểu đóng cửa thanh lịch, ẩn danh.

Rails sử dụng chúng để có hiệu quả tốt. Đây là một ví dụ:

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

Các bao đóng / lambdas ẩn danh giúp dễ dàng hơn trong việc mô phỏng các tính năng ngôn ngữ mới sẽ chiếm các khối. Trong Python, các bao đóng tồn tại, nhưng chúng phải được đặt tên để được sử dụng. Vì vậy, thay vì có thể sử dụng bao đóng để mô phỏng các tính năng ngôn ngữ mới, bạn buộc phải nói rõ về thực tế là bạn đang sử dụng bao đóng.

Ruby có lập trình siêu nhỏ gọn gàng hơn, dễ sử dụng hơn.

Điều này được sử dụng nhiều trong Rails, chủ yếu vì nó dễ sử dụng. Cụ thể, trong Ruby, bạn có thể thực thi mã tùy ý trong ngữ cảnh của lớp. Các đoạn mã sau là tương đương:

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

Trong cả hai trường hợp, bạn có thể thực hiện:

Bar.new.hello  

sẽ in "HELLO". Các class_evalphương pháp cũng mất một String, vì vậy nó có thể tạo ra các phương pháp một cách nhanh chóng, như là một lớp đã được tạo ra, mà đã ngữ nghĩa dựa trên các thông số được thông qua năm khác nhau.

Trên thực tế, có thể thực hiện kiểu lập trình siêu mẫu này bằng Python (và các ngôn ngữ khác), nhưng Ruby có một bước tiến vì lập trình siêu mẫu không phải là một kiểu lập trình đặc biệt. Nó bắt nguồn từ thực tế là trong Ruby, mọi thứ đều là một đối tượng và tất cả các dòng mã đều được thực thi trực tiếp. Do đó, Classbản thân các lớp là các đối tượng, các phần thân của lớp có một selftrỏ tới Lớp và bạn có thể gọi các phương thức trên lớp khi bạn đang tạo một lớp.

Điều này ở mức độ lớn chịu trách nhiệm về mức độ khai báo có thể có trong Rails và sự dễ dàng mà chúng tôi có thể triển khai các tính năng khai báo mới giống như từ khóa hoặc các tính năng ngôn ngữ khối mới.


40
Trong Python, mọi thứ đều là đối tượng và tất cả các dòng mã cũng được thực thi trực tiếp. ;) Nhưng, bạn không có "bản thân" chỉ vào lớp trong thân lớp, điều đó không được tạo cho đến sau định nghĩa lớp, vì vậy bạn phải đặt mã đó sau đó bằng Python, điều này phải thừa nhận là kém thanh lịch hơn , nhưng tương đương về mặt chức năng.
Lennart Regebro

31
@lennart đó là một vấn đề. Python cho phép bạn làm những việc tương tự với lambdas, decorator được đặt tên và đặt mã sau khi các lớp được tạo, nhưng sự mất mát về tính thanh lịch sẽ tăng lên nhanh chóng và khiến một thứ như Rails khó thực hiện hơn đáng kể hoặc kém thanh lịch hơn đáng kể đối với người dùng cuối.
Yehuda Katz

9
Đối với tôi, chúng không thực sự giống sự khác biệt lớn.
Dietrich Epp

10
@lennart Tôi hơi bối rối. Tôi đã nói rằng bạn không cần chúng trong Python - nhưng việc không có chúng khiến mã khó triển khai hơn hoặc kém thanh lịch hơn đối với người dùng cuối (người này hay người khác). Các ngôn ngữ đang hoàn chỉnh - bạn có thể viết Rails bằng C nếu muốn.
Yehuda Katz,

5
@lennart Bây giờ chúng ta đang đi vào lãnh thổ chủ quan, nhưng hai tính năng mà tôi đã nói đến khá thuận tiện khi sản xuất các khuôn khổ với sự kết hợp của lập trình thủ tục và khai báo. Đặc biệt, việc thiếu lambdas ẩn danh là một hạn chế về khả năng biểu đạt của Python. Việc thiếu nhất quán (chỉ cần làm việc với các lớp được tạo SAU KHI các lớp được tạo) cũng khá hạn chế.
Yehuda Katz

58

Những người đã tranh luận rằng

sự thành công to lớn của khung công tác Rails thực sự có liên quan rất nhiều đến ngôn ngữ mà nó được xây dựng

(IMO) nhầm lẫn. Thành công đó có lẽ nhờ vào hoạt động tiếp thị thông minh và bền vững hơn là bất kỳ năng lực kỹ thuật nào. Django được cho là hoạt động tốt hơn trong nhiều lĩnh vực (ví dụ như quản trị viên kick-ass tích hợp) mà không cần bất kỳ tính năng nào của Ruby. Tôi không phản đối Ruby gì cả, chỉ ủng hộ Python!


10
Chà, chúng ta đang tiến vào lãnh thổ chủ quan ở đây. Nếu bạn nghĩ quản trị viên là "duy nhất", thì có lẽ là do bạn chưa được hưởng những lợi ích tiết kiệm thời gian mà nó mang lại. Có bất kỳ lĩnh vực nào mà bạn nghĩ Django làm kém hơn Rails, vì các tính năng mà Ruby có và Python thì không? Vấn đề thực sự không phải là khung công tác nào tốt hơn - đó là liệu (như đã chỉ ra ở nơi khác trong câu hỏi này) có điều gì thiếu trong Python khiến nó kém khả năng phát triển một khung công tác kick-ass hay không. Trên bằng chứng, không thiếu như vậy.
Vinay Sajip

18
@ Gửi đến những người phản đối: Tôi không thực sự bận tâm, nhưng tôi tò mò muốn biết tại sao bạn cho rằng câu trả lời của tôi là vô ích . Tôi không nhận ra một người không đồng ý vì một người không đồng ý với quan điểm của ai đó - tôi thường chỉ phản đối khi tôi cảm thấy rằng một câu hỏi hoặc câu trả lời bằng cách nào đó làm cho mọi thứ tồi tệ hơn.
Vinay Sajip

5
Tôi có thể viết phần quản trị của riêng mình, tôi không cần phần này trong khuôn khổ. Tôi thích những cách khác để làm cho ứng dụng của tôi dễ viết hơn.
nitecoder

8
@railsninja: Tốt cho bạn. Tôi không muốn phải viết các trang soạn sẵn cho các công việc nội trợ của quản trị viên mà hầu hết các hệ thống cần. Gần đây, tôi đã thực hiện một số công việc ủng hộ cho một trang web từ thiện địa phương và sẽ không khả thi để thực hiện trang web đó nếu quản trị viên Django không phải là một phần của phương trình. Như hiện tại, tôi đã cung cấp một trang web có giao diện người dùng Ajaxified khá tùy chỉnh cho người dùng cuối, nhưng quản trị viên phụ đã làm việc với quản trị viên và nó quá đủ cho nhu cầu của họ.
Vinay Sajip, 09/07/09

6
@Matt: Câu hỏi của anh ấy là tại sao Ruby lại phù hợp hơn Python .. Và câu trả lời, khá chính xác, là không phải vậy.
Lennart Regebro

54

Cộng đồng python tin rằng làm mọi thứ theo cách đơn giản và thẳng thắn nhất có thể là hình thức thanh lịch cao nhất. Cộng đồng ruby ​​tin rằng làm mọi thứ theo những cách thông minh cho phép tạo ra mã tuyệt vời là hình thức cao nhất của sự sang trọng.

Rails là tất cả về nếu bạn tuân theo các quy ước nhất định, vô số điều khác sẽ xảy ra với bạn một cách kỳ diệu. Điều đó thực sự phù hợp với cách nhìn của ruby ​​về thế giới, nhưng không thực sự theo cách của con trăn.


4
Chắc chắn rồi, nhưng vẫn có những người Perl (tốt, có thể không nhiều ), những người nghĩ rằng một chữ cái khó hiểu là tuyệt vời, và nhiều người Lisp thề rằng đó là một ngôn ngữ thực. Chúng tôi chắc chắn đang ở trong lãnh thổ thuyền của bạn.
Vinay Sajip

4
Rails không có ma thuật, nó nằm ngay trong nguồn. Nếu bạn muốn biết làm thế nào, hãy ra khỏi mông của bạn và tìm hiểu.
nitecoder,

21
"Bất kỳ công nghệ tiên tiến nào đều không thể phân biệt được với ma thuật." - Arthur C. Clarke
Vinay Sajip

1
"ma thuật" có nghĩa là khuôn khổ thực hiện rất nhiều thứ cho bạn mà không cần được hỏi trực tiếp. Một lần nữa, tôi không đưa ra những đánh giá giá trị, đó là một phong cách làm việc có mặt tốt và mặt xấu. Cá nhân, tôi nghĩ rằng nó hoạt động tuyệt vời trong đường ray.
Matt Briggs 09/07/09

2
Sự sang trọng và quy ước không biểu thị sự kỳ diệu.
BJ Clark

26

Cuộc tranh luận này có phải là cuộc tranh luận "vim so với emacs" mới không?

Tôi là một lập trình viên Python / Django và cho đến nay tôi chưa bao giờ tìm thấy một vấn đề nào trong ngôn ngữ / khuôn khổ đó sẽ khiến tôi chuyển sang Ruby / Rails.

Tôi có thể tưởng tượng rằng nó sẽ giống như vậy nếu tôi đã có kinh nghiệm với Ruby / Rails.

Cả hai đều có triết lý tương tự và thực hiện công việc một cách nhanh chóng và thanh lịch. Sự lựa chọn tốt hơn là những gì bạn đã biết.


25

Cá nhân tôi thấy ruby ​​vượt trội hơn trăn về nhiều mặt, điều mà tôi gọi là 'biểu cảm nhất quán'. Ví dụ: trong ruby, join là một phương thức trên đối tượng mảng xuất ra một chuỗi, vì vậy bạn sẽ nhận được một cái gì đó như sau:

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

Trong python, tham gia là một phương thức trên đối tượng chuỗi nhưng sẽ gây ra lỗi nếu bạn chuyển nó một cái gì đó không phải là một chuỗi làm thứ để tham gia, do đó, cùng một cấu trúc giống như:

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

Có rất nhiều loại khác biệt nhỏ này cộng lại theo thời gian.

Ngoài ra, tôi không thể nghĩ ra cách tốt hơn để đưa ra các lỗi logic vô hình hơn là làm cho khoảng trắng trở nên đáng kể.


29
Kinh nghiệm của tôi là làm cho khoảng trắng đáng kể sẽ giúp biến mất các lỗi logic. Sẽ khó hiểu hơn nhiều khi có sự bất đồng về khoảng cách và cú pháp.
Nosredna 09/07/09

5
Trong các ngôn ngữ có bắt đầu và kết thúc và trong các ngôn ngữ có dấu ngoặc nhọn và hợp ngữ, tôi đã thấy mã bị dán sai và gây ra sự cố sau đó. Đó luôn là một vấn đề. Bạn đã gặp rất nhiều rắc rối với việc mọi người dán Python không tốt?
Nosredna 09/07/09

5
Khoảng trắng không quan trọng trong Python: secnetix.de/~olli/Python/block_indentation.hawk . Hầu như không thể đưa ra "lỗi vô hình" do thụt lề trong Python (bạn phải di chuyển cài đặt trình chỉnh sửa của mình) trong khi tất nhiên bạn hoàn toàn có thể mắc phải lỗi vô hình do thụt lề trong bất kỳ ngôn ngữ nào khác, chỉ đơn giản bằng cách thụt lề không chính xác. @fields: Vì vậy, đừng sao chép mã qua skype hoặc HTML. Hừ!
Lennart Regebro, 09/07/09

7
Đúng là Python phàn nàn nếu bạn cố gắng thêm các chuỗi không phải vào chuỗi, như trong một Tham gia. Điều này là do rõ ràng tốt hơn là ẩn. Có rất ít chuyển đổi tự động trong Python và lý do là chúng có xu hướng dẫn đến các vấn đề, đặc biệt là trong các ngôn ngữ động, vì mọi thứ cuối cùng không giống như bạn mong đợi. Chắc chắn phương thức "" .join () có cảm giác ngược lại lúc đầu, nhưng đó là lý do. Nó thực sự không có ý nghĩa trong danh sách ...
Lennart Regebro

8
Chúa toàn năng ... Ý bạn là gõ tĩnh chứ không phải gõ mạnh. Python được gõ mạnh, Ruby cũng vậy: stackoverflow.com/questions/520228/… Bạn cũng không thể thêm một chuỗi vào một số nguyên trong Ruby. Tôi đang rất mệt mỏi với việc sửa chữa cho bạn, vui lòng kiểm tra sự thật của bạn trước khi bạn trả lời trong tương lai.
Lennart Regebro,

15

Câu trả lời thực sự là Python hay Ruby đều không phải là ứng cử viên tốt hơn / tệ hơn cho một khuôn khổ web. Nếu bạn muốn khách quan, bạn cần viết một số mã cho cả hai và xem cái nào phù hợp với sở thích cá nhân của bạn nhất, bao gồm cả cộng đồng.

Hầu hết những người tranh luận cho điều này hay điều khác đều chưa bao giờ sử dụng ngôn ngữ kia một cách nghiêm túc hoặc đang 'bỏ phiếu' cho sở thích cá nhân của họ.

Tôi đoán hầu hết mọi người sẽ giải quyết vấn đề mà họ tiếp xúc đầu tiên bởi vì nó dạy cho họ điều gì đó mới (MVC, thử nghiệm, trình tạo, v.v.) hoặc làm điều gì đó tốt hơn (plugin, khuôn mẫu, v.v.). Tôi đã từng phát triển với PHP và đã tiếp xúc với RubyOnRails. Nếu tôi đã biết về MVC trước khi tìm thấy Rails thì rất có thể tôi sẽ không bao giờ bỏ lại PHP. Nhưng khi tôi bắt đầu sử dụng Ruby, tôi rất thích cú pháp, tính năng, v.v.

Nếu tôi đã tìm thấy Python và một trong các khung công tác MVC của nó trước tiên, tôi rất có thể sẽ khen ngợi ngôn ngữ đó thay thế!


11

Python có một loạt các khung công tác giống như Rails. Có rất nhiều câu chuyện cười nói rằng trong cuộc nói chuyện điển hình tại PyCon, ít nhất một web framework sẽ nhìn thấy ánh sáng.

Lập luận rằng lập trình meta Rubys sẽ làm cho nó phù hợp hơn là IMO không chính xác. Bạn không cần lập trình ẩn cho các khuôn khổ như thế này.

Vì vậy, tôi nghĩ chúng ta có thể kết luận rằng Ruby không tốt hơn (và có thể cũng không tệ hơn) so với Python về mặt này.


8

Vì Rails được phát triển để tận dụng bộ tính năng của Rubys.

Một câu hỏi ngớ ngẩn tương tự sẽ là "Tại sao Python lại phù hợp với Django hơn Ruby?".


4

Tôi cho rằng chúng ta không nên thảo luận về ngôn ngữ đặc trưng cho mỗi gia nhập mà là điểm nhấn các cộng đồng tương ứng thực hiện trên các tính năng ngôn ngữ. Ví dụ, trong Python, việc mở lại một lớp là hoàn toàn có thể nhưng nó không phổ biến; trong Ruby, tuy nhiên, việc mở lại một lớp học là một việc làm thường ngày. điều này cho phép tùy chỉnh khung công tác nhanh chóng và đơn giản theo yêu cầu hiện tại và khiến Ruby trở nên thuận lợi hơn cho các khung công tác giống Rails hơn bất kỳ ngôn ngữ động nào khác. Do đó câu trả lời của tôi: sử dụng phổ biến của các lớp học mở lại.


1

Một số người đã nói rằng kiểu lập trình ẩn cần thiết để làm cho ActiveRecord (một thành phần chính của rails) có thể thực hiện trong ruby ​​dễ dàng và tự nhiên hơn trong ruby ​​so với trong python - tôi chưa biết python;), vì vậy tôi không thể xác nhận tuyên bố này.

Tôi đã sử dụng đường ray một thời gian ngắn, và việc sử dụng catchalls / interceptors và đánh giá động / chèn mã cho phép bạn hoạt động ở mức độ trừu tượng cao hơn nhiều so với một số khung công tác khác (trước thời điểm của nó). Tôi có rất ít hoặc không có kinh nghiệm với framework của Python - nhưng tôi nghe nói rằng nó có khả năng tương đương - và cộng đồng python đã làm rất tốt việc hỗ trợ và thúc đẩy các nỗ lực của trăn.


3
Thật vậy, loại "ma thuật" này thường được sử dụng trong Python; ví dụ, code.djangoproject.com/wiki/RemovingTheMagic
ephemient

2
Tôi nghĩ rằng "ma thuật" (các thủ thuật lập trình ẩn dụ) vì lợi ích "ma thuật" nên luôn được chú ý - mã đơn giản hơn, nhưng không kém phần mạnh mẽ và biểu cảm, nên luôn giành chiến thắng - nhưng có những trường hợp cách duy nhất để cung cấp chức năng và cú pháp chính xác bạn muốn yêu cầu "ma thuật" - và trong những trường hợp, các "ma thuật" là indispendable;)
Faisal Vali

1

Tôi nghĩ rằng cú pháp rõ ràng hơn và Ruby, đối với tôi, ít nhất là "thú vị" hơn rất nhiều - chủ quan là như vậy!


-1

Hai câu trả lời:

a. Bởi vì đường ray được viết cho ruby.

b. Vì lý do tương tự, C phù hợp với Linux hơn Ruby


Với bối cảnh của câu trả lời câu hỏi hoàn toàn không có ý nghĩa.
lorefnon

-6

Tất cả những điều này HOÀN TOÀN LÀ "IMHO"

Trong Ruby có MỘT khung ứng dụng web, vì vậy nó là khung duy nhất được quảng cáo cho ngôn ngữ đó.

Python đã có một số từ khi mới thành lập, chỉ cần kể tên một số: Zope, Twisted, Django, TurboGears (bản thân nó là sự kết hợp của các thành phần khung khác), Pylons (một bản sao của khung công tác Rails), v.v. Không ai trong số chúng được hỗ trợ trên toàn cộng đồng python là "THE one to use", vì vậy tất cả các "groundwell" được trải rộng trên một số dự án.

Rails có quy mô cộng đồng chỉ vì Rails.

Cả Python và Ruby đều hoàn toàn có khả năng thực hiện công việc như một khung ứng dụng web. Sử dụng cái mà BẠN (và nhóm phát triển tiềm năng của bạn) thích và có thể phù hợp.


7
ruby có nhiều mô hình ứng dụng web: Nitro, Merb, Cắm trại .. đến tên một vài
Corban Brook

5
Thêm: Sinatra và thậm chí một ứng dụng Rack trống cho các ứng dụng web rất nhanh rất tối thiểu.
Kris

2
-1 "Trong Ruby có MỘT khung ứng dụng web" quá phân loại ... cho một tuyên bố sai. Nitro, Merb, Cắm trại, Sinatra
Maximiliano Guzman

2
Ý kiến ​​không được thông tin từ cả hai phía chính xác là nguyên nhân gây ra sự bối rối cho những người mới đang cố gắng giải quyết tất cả những điều này. Nó cũng có nghĩa là người ta có thể bỏ lỡ một thứ mà họ thực sự đánh giá cao nếu họ biết rõ hơn.
Walt Jones

3
Tôi nghĩ rằng quan điểm của mình là Rails có MindShare lớn của cộng đồng Ruby hơn Django có của cộng đồng Python, đó là hợp lệ
pjb3
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.