簡體   English   中英

Ruby是在運行時加載方法還是編譯?

[英]Ruby loads the methods at run time or compile?

我正在開發一個平台,他們要求我集成Pundit gem。 創建策略時,我意識到許多方法都具有相同的訪問控制策略。 例:

Action1: Only accessible by the administrator or owner of the resource
Action2: Only accessible by the administrator or owner of the resource
Action3: Only accessible by the administrator or owner of the resource
.
.
.

然后我想到了通過以下方式創建動態方法

[: Action1 ?,: Action2? ,: Action3?].each do |meth|
     define_method(meth){@current_user.admin? or @current_user.owner_resource?}
end

但是我有一個問題:Ruby on Rails是在運行時還是在編譯時執行這些方法? 創建動態方法是否最優,還是以靜態方式分別創建3個方法更好?

謝謝!!!

Ruby on Rails是在運行時還是在編譯時執行這些方法?

運行。

方法在首次解釋時將被分析 ,但是實際代碼直到運行后才被評估。

方法定義可以包含完整的廢話(例如,未定義的變量)-但除非包含語法錯誤 ,否則在實際調用代碼之前不會暴露此錯誤

...這純粹是“紅寶石”的事; 無論是否使用rails框架,它都會發生。

創建動態方法是否最優,還是以靜態方式分別創建3個方法更好?

這個取決於你所說的“最優”。

在性能方面,使用靜態方法要快一些。 但是,除非您要構建核心庫,否則差異可以忽略不計-因此,我不必為此擔心。

但是,還有其他充分的理由在可能的情況下靜態定義方法。 即:代碼不那么混亂,更容易導航到方法定義(例如,使用IDE時),並且在元編程較少的情況下更容易更改方法定義。

就個人而言,我可能傾向於將這些方法定義為:

def action1?
  user.admin? || user == record.owner
end

def action2?
  action1?
end

def action3?
  action1?
end

(但是,如果不知道該action實際上是什么,或者它們如何適合您的應用程序的更廣泛的上下文,則很難給出具體的建議。)

或者,如果您願意,也可以使用alias

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM