繁体   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