gpt4 book ai didi

ruby-on-rails - Eval() 与表达式树

转载 作者:数据小太阳 更新时间:2023-10-29 08:13:48 26 4
gpt4 key购买 nike

我正在设计一个调查系统,供我们的客户向中央办公室报告数据。在哪些情况下问哪些问题是一个复杂的问题,需要在不更改代码的情况下进行定制。我的想法如下:

型号

Question < ActiveRecord::Base
attr_accessible :conditional_statement
has_and_belongs_to_many :named_conditionals
end

NamedConditional < ActiveRecord::Base
attr_accessible :name
has_and_belongs_to_many :questions

def evaluate
# return true or false, depending on which conditional and the state of the system
end
end

这里的想法是 NamedConditional 可以对系统状态执行测试,并返回一个 bool 值。这些命名条件可以在 Questionconditional_statement 中使用许多 NamedConditionals 和逻辑运算符按名称引用。然后确定是否应该询问给定问题的流程将如下所示:

  1. 查找所有相关的NamedCondtionals
  2. 评估所有相关的 NamedConditionals
  3. 使用每个NamedConditional的值来评估Question中的conditional_statement

我的问题是在步骤 3 中,使用 eval() 来计算 conditional_statement 的代价是多少?我看到另一个选项是在保存 Question 时将 conditional_statement 解析为表达式树,将其存储在数据库中(序列化),然后在需要对其进行评估时将其反序列化.

对于一个给定的请求,可能有很多(100 多个)问题需要解决。显然,我可以缓存和重用每个 NamedConditional 的值(因为每个值都将用于多个问题)。在这种情况下,eval() 是否会比表达式树执行得更好?或者这两个选项都是垃圾?

最佳答案

直觉是表达式树序列化/反序列化比仅仅评估一些条件要花费更长的时间。

毕竟 - 以 ruby​​ 的速度评估条件 - 加上一个用于解释字符串的小常量。序列化/反序列化很慢 - 并且至少会随着 N 的增加而呈多项式增加......可能不止于此。

关于ruby-on-rails - Eval() 与表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com