Чому Ruby більше підходить для Rails, ніж Python? [зачинено]


90

Пітон і Рубі зазвичай вважаються близькими двоюрідними братами (хоча і з досить різним історичним багажем) з подібною виразністю та силою. Але деякі стверджують, що величезний успіх фреймворку Rails справді має багато спільного з мовою, на якій він побудований: сама Ruby. То чому Ruby більше підходить для такого фреймворку, ніж Python?


44
Алітерація. _
Джиммі

75
"Пітон на відрах" просто не має такого самого відчуття ...
ефемієнт

105
@Ephemient: Я вважаю, що це буде Python на Planes.
Джиммі

37
@Jimmy: Кому потрібні літаки? імпорт антигравітації ;-) xkcd.com/353
Vinay Sajip

157
Чи є Java у в’язницях?
Nosredna

Відповіді:


170

Ймовірно, є дві основні відмінності:

Ruby має елегантні, анонімні закриття.

Rails ефективно використовує їх. Ось приклад:

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

Анонімні закриття / лямбди полегшують наслідування нових мовних функцій, які забирають блоки. У Python існують закриття, але вони повинні бути названі для використання. Отже, замість того, щоб мати змогу використовувати закриття для емуляції нових мовних функцій, ви змушені бути явними щодо того, що використовуєте закриття.

Ruby має чистіший, простіший у використанні метапрограмування.

Це широко використовується в Rails, в першу чергу через те, наскільки простий у використанні. Якщо бути конкретним, у Ruby ви можете виконати довільний код у контексті класу. Наступні фрагменти еквівалентні:

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

В обох випадках ви можете зробити наступне:

Bar.new.hello  

який надрукує "ПРИВІТАЙ". class_evalМетод також приймає рядок, так що можна створювати методи на льоту, як створюється клас, що мають різну семантику на основі параметрів, які передаються в.

Насправді це можливо зробити подібного роду метапрограмування на Python (та й інших мовах теж), але Ruby має ногу, оскільки метапрограмування не є особливим стилем програмування. Це випливає з того, що в Ruby все є об'єктом і всі рядки коду виконуються безпосередньо. Як результат, Classes - це самі об'єкти, тіла класу мають selfвказівку на Клас, і Ви можете викликати методи класу під час його створення.

Це значною мірою відповідає за ступінь декларативності, можливої ​​в Rails, і легкість, за допомогою якої ми можемо впроваджувати нові декларативні функції, схожі на ключові слова або нові функції блочної мови.


40
У Python все є об'єктами, і всі рядки коду теж виконуються безпосередньо. ;) Але, у вас немає "self", що вказує на клас у тілі класу, який створюється лише після визначення класу, тому вам доведеться помістити цей код згодом у Python, що, як визнається, менш елегантний , але функціонально еквівалентний.
Леннарт Регебро

31
@lennart, ось у чому справа. Python дозволяє робити такі самі речі з іменованими лямбда, декораторами та введенням коду після створення класів, але втрата елегантності швидко додається і робить щось на зразок Rails помітно складнішим для реалізації або помітно менш елегантним для кінцевих користувачів.
Yehuda Katz

9
Вони насправді не схожі на великі відмінності.
Дітріх Епп

10
@lennart Я трохи розгублений. Я сказав, що вони вам не потрібні в Python, - але їх відсутність ускладнило реалізацію коду або стало менш елегантним для кінцевих користувачів (тих чи інших). Ці мови є повними - ви можете написати Rails на C, якщо хочете.
Yehuda Katz

5
@lennart Зараз ми потрапляємо на суб’єктивну територію, але дві особливості, про які я говорив, досить зручні при створенні фреймворків із поєднанням декларативного та процедурного програмування. Відсутність анонімних лямбд, зокрема, є обмеженням виразності Python. Відсутність узгодженості (необхідність працювати зі створеними класами лише ПІСЛЯ створення класів) також є досить обмежуючою.
Yehuda Katz

58

Ті, хто це аргументував

величезний успіх фреймворку Rails справді має багато спільного з мовою, на якій він побудований

помиляються (IMO). Цей успіх, швидше за все, завдячує розумному та стійкому маркетингу, ніж будь-якій технічній майстерності. Можливо, Django робить кращу роботу в багатьох областях (наприклад, вбудований адміністратор), без необхідності використання будь-яких функцій Ruby. Я взагалі не виганяю Рубі, просто заступаюся за Python!


10
Що ж, ми потрапляємо сюди на суб’єктивну територію. Якщо ви вважаєте, що адміністратор є "єдиним", то, можливо, це тому, що ви не користувались економічними витратами часу, які він надає. Чи є якісь області, які, на вашу думку, Django робить гірше, ніж Rails, через функції, якими володіє Ruby, а Python - ні? Справа насправді не в тому, який фреймворк є кращим - це в тому, (як зазначалося в іншому місці цього питання) чогось не вистачає в Python, що робить його менш здатним розробляти каркасний фреймворк. Що стосується доказів, такого браку немає.
Vinay Sajip

18
@ До прихильників вибору: Я насправді не проти, але мені цікаво дізнатися, чому ви вважали, що моя відповідь була безрезультатною . Я не усвідомлював, що один голосував проти, тому що хтось не погоджувався з чиєюсь позицією - я, як правило, голосував лише там, де я відчував, що питання чи відповідь якось погіршують ситуацію.
Vinay Sajip

5
Я можу написати власний розділ адміністратора, мені це не потрібно в рамках. Я віддаю перевагу іншим способам полегшення написання моєї заявки.
nitecoder

8
@railsninja: Добре вам. Я вважаю за краще не писати зразкові сторінки для ведення господарських справ, які потрібні більшості систем. Нещодавно я про-боно працював над місцевим благодійним веб-сайтом, і це було б неможливо зробити взагалі, якби адміністратор Django не був частиною рівняння. Як би там не було, я надав сайту досить налаштований інтерфейс Ajaxified для кінцевих користувачів, але адміністратори бек-енду працювали з адміністратором, і це було більш ніж достатнім для їхніх потреб.
Vinay Sajip

6
@Matt: Його запитання полягає в тому, чому Рубі БІЛЬШЕ придатний, ніж Python .. І відповідь, цілком вірна, полягає в тому, що це не так.
Леннарт Регебро

54

Спільнота пітонів вважає, що робити речі найпростішим і прямим можливим способом - це найвища форма елегантності. Спільнота рубінів вважає, що робити речі розумно, дозволяючи крутий код, є найвищою формою елегантності.

Rails - це все про те, що якщо ви дотримуєтеся певних домовленостей, для вас чарівно відбувається безліч інших речей. Це справді добре справляється з рубіновим поглядом на світ, але насправді не йде шляхом пітона.


4
Звичайно, але є втрата людей Perl (ну, можливо, не багато ), які вважають, що загадкові однокласні лайнери - це круто, і багато людей Lisp, які клянуться, що це єдина справжня мова. Ми точно знаходимось на території, де б то не було.
Vinay Sajip

4
Rails має нульову магію, вона знаходиться саме там, у джерелі. Якщо ви хочете знати, як, сходьте з дупи і дізнайтеся.
nitecoder

21
"Будь-яку досить просунуту технологію неможливо відрізнити від магії". - Arthur C. Clarke
Vinay Sajip

1
"магія" означає, що фреймворк робить для вас безліч речей без прямого запитання. Знову ж таки, я не приймаю оціночних суджень, це один із способів робити те, що має добрі і погані сторони. Особисто я думаю, що це чудово працює на рейках.
Метт Бриггс,

2
Елегантність і умовності не позначають магію.
BJ Clark,

26

Чи є ця дискусія новою дискусією "vim проти emacs"?

Я програміст Python / Django, і дотепер я ніколи не знайшов проблеми в цій мові / фреймворку, яка могла б перевести мене на Ruby / Rails.

Я можу уявити, що це було б так само, якби я мав досвід роботи з Ruby / Rails.

Обидва мають схожу філософію і виконують роботу швидко і елегантно. Кращий вибір - це те, що ви вже знаєте.


25

Особисто я вважаю, що рубін перевершує python у багатьох відношеннях, які включають те, що я назвав би "послідовною виразністю". Наприклад, у ruby, join - це метод об’єкту масиву, який виводить рядок, тож ви отримуєте щось подібне:

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

У python, join - це метод для рядкового об'єкта, але який видає помилку, якщо ви передаєте йому щось інше, ніж рядок, як річ, до якої слід приєднатися, тому та сама конструкція є приблизно такою:

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

Існує багато таких різновидів відмінностей, які з часом складаються.

Крім того, я не можу придумати кращого способу ввести невидимі логічні помилки, ніж зробити пробіли значними.


29
Мій досвід полягає в тому, що надання значущих пробілів допомагає усунути логічні помилки. Набагато заплутаніше, коли розбіжності та синтаксис не погоджуються.
Nosredna

5
У мовах із початком і кінцем, а також у мовах із фігурними дужками та у збірці я бачив, як код вставлявся неправильно і викликав проблеми пізніше. Це завжди проблема. Чи було у вас багато проблем з тим, що люди погано вставляли Python?
Nosredna

5
Пробіли не є значущими у Python: secnetix.de/~olli/Python/block_indentation.hawk . Практично неможливо ввести "невидимі помилки" через відступ у Python (вам потрібно обдурити налаштування редактора), хоча, звичайно, цілком можливо внести невидимі помилки через відступ будь-якою іншою мовою, просто неправильним відступом. @fields: Тож не копіюйте код через Skype або HTML. Господи.
Леннарт Регебро

7
Правильно, що Python скаржиться, якщо ви намагаєтесь додати не-рядки до рядків, як у Join. Це тому, що явне краще, ніж неявне. Автоматичних перетворень у Python дуже мало, і причиною цього є те, що вони, як правило, призводять до проблем, особливо в динамічних мовах, оскільки в кінцевому підсумку все відбувається не так, як ви очікували. Звичайно, метод "" .join () спочатку відчуває себе зворотним, але це причина. Це насправді не має сенсу у списку ...
Леннарт Регебро

8
Бог всемогутній ... Ви маєте на увазі статичний тип, а не сильно тип. Python сильно набирається, як і Ruby: stackoverflow.com/questions/520228/ ... Ви також не можете додати рядок до цілого числа в Ruby. Я втомився виправляти вас, будь ласка, перевірте свої факти, перш ніж відповідати в майбутньому.
Леннарт Регебро

15

Реальна відповідь - ні Python, ні Ruby не є кращими / гіршими кандидатами на веб-фреймворк. Якщо ви хочете об’єктивність, вам потрібно написати якийсь код обом і подивитися, що найбільше відповідає вашим особистим уподобанням, включаючи спільноту.

Більшість людей, які сперечаються за те чи інше, або ніколи серйозно не використовували іншу мову, або "голосують" за свої особисті переваги.

Я гадаю, більшість людей вирішують питання, з якими вони коли-небудь контактують першими, оскільки це вчить їх чомусь новому (MVC, тестування, генератори тощо) або робить щось краще (плагіни, шаблони тощо). Раніше я розробляв PHP і контактував з RubyOnRails. Якби я знав про MVC до пошуку Rails, я б, швидше за все, ніколи не залишав PHP позаду. Але коли я почав користуватися Ruby, мені сподобався синтаксис, функції тощо.

Якби я спочатку знайшов Python та один з його фреймворків MVC, я б, швидше за все, хвалив цю мову!


11

Python має цілий ряд Rails-подібних фреймворків. Тут так багато жартів, що під час типової розмови в PyCon хоч один веб-фреймворк побачить світло.

Аргумент того, що метапрограмування Rubys зробило б його більш придатним, є неправильним IMO. Вам не потрібно метапрограмування для таких фреймворків.

Тому я думаю, що ми можемо зробити висновок, що Ruby в цьому відношенні не кращий (і, мабуть, не гірший) ніж Python.


8

Оскільки Rails розроблений, щоб скористатися набором функцій Rubys.

Подібним безпроблемним питанням було б "Чому Python більше підходить для Django, ніж Ruby?".


4

Я вважаю, що ми не повинні обговорювати мовні особливості як такі, а скоріше акценти, які відповідні спільноти роблять на мовні особливості. Наприклад, у Python повторне відкриття класу цілком можливо, але це не часто; однак у Ruby повторне відкриття класу є щоденною практикою. це дозволяє швидко і прямо налаштувати фреймворк відповідно до поточних вимог і робить Ruby вигіднішим для Rails-подібних фреймворків, ніж будь-яка інша динамічна мова. Звідси моя відповідь: загальне використання повторного відкриття класів.


1

Деякі говорили, що тип метапрограмування, необхідний для того, щоб зробити можливим ActiveRecord (ключовий компонент рейок), простіше і природніше зробити в рубіні, ніж у python - я ще не знаю python;), тому я не можу особисто підтвердити це твердження.

Я коротко використовував рейки, і його використання кетчалів / перехоплювачів та динамічної оцінки / введення коду дозволяє вам працювати на набагато вищому рівні абстракції, ніж деякі інші фреймворки (до свого часу). У мене майже немає досвіду роботи з фреймворком Python - але я чув, що він однаково спроможний - і що спільнота python робить чудову роботу, підтримуючи та сприяючи пітонічним зусиллям.


3
Дійсно, у Python на цей вид "магії" часто нарікають; наприклад, code.djangoproject.com/wiki/RemovingTheMagic
ephemient

2
Я думаю, що на "магію" (фокуси на метапрограмування) задля "магії" слід завжди дивитись - простіший код, але однаково потужний та виразний, завжди повинен перемагати - але бувають випадки, коли єдиний спосіб надати точну функціональність та синтаксис вам потрібно "магія" - і в цих випадках "магія" не підлягає;)
Фейсал Валі

1

Я думаю, що синтаксис чистіший, і Ruby, принаймні для мене, просто набагато «приємніший» - настільки ж суб’єктивний!


-1

Дві відповіді:

a. Тому що рейки були написані для рубіну.

b. З тієї ж причини C більше підходить для Linux, ніж Ruby


Враховуючи контекст запитання, відповідь абсолютно не має сенсу.
lorefnon

-6

Все це ЗАГАЛЬНО "ІМХО"

У Ruby існує ОДИН фреймворк веб-додатків, тому це єдиний фреймворк, який рекламується для цієї мови.

З моменту створення Python мав декілька, назвемо лише декілька: Zope, Twisted, Django, TurboGears (він сам є поєднанням інших компонентів фреймворку), Pylons (своєрідний клон фреймворку Rails) тощо. Жоден з них не підтримується у всій спільноті пітонів як "ТИЙ, який слід використовувати", тому всі "паркові ділянки" розподілені на декілька проектів.

Rails має розмір спільноти виключно, або принаймні в переважній більшості, саме через Rails.

І Python, і Ruby цілком здатні виконувати цю роботу як фреймворк веб-додатків. Використовуйте того, хто ВАМ (і вашій потенційній команді розробників) подобається і може дотримуватися.


7
ruby має декілька фреймворків веб-додатків: Nitro, Merb, Camping .., щоб назвати декілька
Корбан Брук

5
Додайте: Sinatra і навіть голий додаток Rack для дуже швидких, дуже мінімальних веб-додатків.
Kris

2
-1 "У Ruby є ОДИН фреймворк веб-додатків" занадто категоричний ... для помилкового твердження. Nitro, Merb, Camping, Sinatra
Максиміліано Гусман

2
Неінформовані думки з обох сторін є саме причиною плутанини для новачків, які намагаються все це розібратися. Це також означає, що можна було б пропустити щось, що вони насправді оцінили б, якби знали краще.
Уолт Джонс

3
Я думаю, його суть полягала в тому, що Rails має великий обмін думками спільноти Ruby, ніж Django спільноти Python, що є дійсним
pjb3
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.