Rails並不是用Ruby編寫的
這是來自波蘭人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。
更多點選標題
相關文章
- rails on ruby,ruby on rails 之程式碼塊(二)AI
- Ruby on Rails 生成指定版本的 Rails 專案AI
- ruby on rails 小技巧AI
- Ruby on Rails Ping ++ 支付AI
- ruby on rails筆記和理解AI筆記
- Ruby on Rails Mountable vs. Full EngineAI
- Ruby on rails專案中 引入BootstrapAIboot
- 從NodeJS切換到Ruby on Rails - nikodunkNodeJSAI
- Ruby on Rails中的MVC架構是如何工作的AIMVC架構
- 使用 Typhoeus 和 Ruby 編寫的爬蟲程式爬蟲
- 強大的Rails/Ruby開發工具:JetBrains RubyMine 2023 for macAIMac
- 肖威洞察 | Ruby on Rails 的快速學習的體系框架;AI框架
- 開發新手最容易犯的50個 Ruby on Rails 錯誤(1)AI
- 【Ruby on Rails全棧課程】2.7 塊(Block)和迭代器AI全棧BloC
- 從底層去認識 ruby 的load,require,gems,bundler,以及rails中的autoloadingUIAI
- 幽默:Ruby on Rails團隊提出Rail治理名單引發爭議AI
- 幽默:Ruby on Rails建立者DHH質疑無伺服器和微服務AI伺服器微服務
- Ruby on Rails 動態渲染遠端程式碼執行漏洞 (CVE-2016-0752)AI
- [Ruby Summit 2018 話題分享] 模組化的 Rails,微服務以外的另一種選擇MITAI微服務
- QT6編寫外部庫並呼叫QT
- 用vim編寫markdown
- 第3章 Rails應用的架構AI架構
- 用Python編寫自己的微型RedisPythonRedis
- Kubernetes 的 secret 並不是真正的 secret
- 從0使用Ruby on Rails打造企業級RESTful API專案實戰之我的雲音樂AIRESTAPI
- Go 編寫 Web 應用GoWeb
- 用PHP編寫Android應用程式PHPAndroid
- [譯]編寫可以複用的 HTML 模板HTML
- 編寫友好的命令列應用程式命令列
- RubyMine 2022 Mac(Ruby程式碼編輯)Mac
- rails graphql的使用AI
- linux編寫.sh指令碼並賦許可權Linux指令碼
- 用 Vue 編寫抽象元件Vue抽象元件
- 測試用例編寫方法
- 用Rust編寫的快如閃電的程式碼編輯器:lapceRust
- RubyMine 2022 for Mac(Ruby程式碼編輯器)Mac
- drf序列化用APIView寫編寫5個介面並校驗資料APIView
- 編寫可調模板並使用自動調諧器