Rails並不是用Ruby編寫的

banq發表於2022-02-05

這是來自波蘭人solnic.codes的帖子,大意如下:

波蘭語是一門非常難學的語言,它實際上被認為是世界上最難學習的 10 種語言之一。在波蘭,就像在許多其他國家一樣,有些地區使用方言而不是“純粹”的語言形式,所以在我的城市,我們有自己的方言。

程式語言也有方言,根據定義,程式語言方言是“語言的(相對較小的)變體或擴充套件,不會改變其內在性質”。這種變化或擴充套件是如何實現的並不重要。重要的部分是原始語言得到了擴充套件,它提供了更多的功能,而它的原始性質和行為保持不變。

Ruby是一種具有開放類的程式語言,即使是語言的核心功能也可以通過簡單地向核心類新增新方法來擴充套件,例如String或Array. 這使得建立自己的 Ruby 方言變得非常簡單!

DHH 在建立 Ruby on Rails 框架時就利用了 Ruby 的這一獨特功能。這個框架的基礎是一個名為 ActiveSupport 的庫——一個核心 Ruby 擴充套件的大集合,它們共同建立了一個 Ruby 方言,一個 Ruby 語言的擴充套件版本,它不會改變它的內在本質。

如果你試圖從 Rails 中刪除 ActiveSupport,一切都會崩潰。

 

Monkey-patching是另一種說法,即某段程式碼通過利用Ruby中的開放類來改變一個現有的類。ActiveSupport庫對許多類進行了Monkey-patch,目前在其core_ext目錄下有3471個LOC。

當你有一個庫,一個 ruby​​ gem,它為核心類新增了如此大量的新方法時,理解這一點很重要:

  • 您不再使用 Ruby,您現在使用的是 Ruby 方言,實現為名為 ActiveSupport 的庫
  • 您必須知道,您在應用程式程式碼中新增到自己的類的方法可能會導致與 ActiveSupport 發生衝突
  • 構建其他庫(也是猴子補丁核心類)是一個非常糟糕的主意,因為它們也會導致衝突

前段時間,我們有很大依賴monkey-patching的ruby gems,我們甚至有一個旨在與 Rails 競爭的全棧框架。它被稱為 Merb,它也有類似 ActiveSupport 的東西,它被稱為 extlib。正如您可能猜到的那樣——它導致了與 ActiveSupport 的衝突,因此在同一個程式碼庫中使用這兩個庫並不可行。

不過,Merb 和 Rails “合併”到了 Rails 3 中,這就是我們不再有“extlib 問題”的原因,因為庫已經消失了。

隨著時間的推移,許多從事各種 gem 的 Ruby 開發人員已經瞭解了monkey-patching的缺點,並且乾脆停止了。

不幸的是,即使大多數 gem 不再依賴於monkey-patchin,我們仍然有 ActiveSupport,因為它是 Rails 的基礎部分。畢竟,框架是用 ActiveSupport Ruby 方言編寫的!

不過,問題的癥結在於:

作為 Ruby 方言的一部分實現的 API 看起來“更好”、更簡潔和自然

為什麼?因為它看起來像是語言的一部分!這就是為什麼像這樣的東西1.day.ago看起來如此“自然”。除了它不是 Ruby ,因為它是 ActiveSupport。

 

更多點選標題

 

相關文章