[英]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.