加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby:使用动态绑定变量来计算字符串

发布时间:2020-12-17 02:49:04 所属栏目:百科 来源:网络整理
导读:我有一个存储为字符串的“公式”数据库.让我们假设为简单起见,每个公式包含2个由a和b表示的变量,并且公式都是良好的,并且确保它只包含来自set()ab – *的字符. 在运行时,从此数据库中提取公式,并从另一个源获取a和b的数值,并计算公式.评估可以这样编程: # T
我有一个存储为字符串的“公式”数据库.让我们假设为简单起见,每个公式包含2个由a和b表示的变量,并且公式都是良好的,并且确保它只包含来自set()ab – *的字符.

在运行时,从此数据库中提取公式,并从另一个源获取a和b的数值,并计算公式.评估可以这样编程:

# This is how it works right now
formula = fetch_formula(....)
a = fetch_left_arg(....)
b = fetch_right_arg(....)
result = eval(formula)

这个设计有效,但我对此并不满意.它要求我的程序将自由变量命名为与公式中命名的完全相同,这很难看.

如果我的“公式”不是字符串,而是Proc对象或接受两个参数的Lambda,我可以做类似的事情

# No explicitly named variables
result = fetch_proc(...).call(fetch_left_arg(....),fetch_right_arg(....))

但不幸的是,公式必须是字符串.

我尝试按以下方式进行实验:如果从数据库中获取公式的方法将字符串包装成某个行为类似于块的内容,并且我可以将参数传递给它,该怎么办?

# This does not work of course,but maybe you get the idea:
block_string = "|a,b| #{fetch_formula(....)}"

当然我不能评估这样的block_string,但有什么类似我可以使用的吗?我知道instance_eval可以传递参数,但我应该将它应用于哪个对象?所以这也许不是一个选择….

解决方法

避免在本地范围内创建变量的一种方法是使用 Binding

bind = binding
formula = fetch_formula(....)
bind.local_variable_set :a,fetch_left_arg(....)
bind.local_variable_set :b,fetch_right_arg(....)
result = bind.eval(formula)

变量a和b现在只存在于绑定中,并且不会污染代码的其余部分.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读