将字符串编译为Ruby字节码以提高性能 — 类似于Python中的compile()

4 投票
2 回答
836 浏览
提问于 2025-04-15 16:59

我有一段字符串(比如“authenticated”、“trusted”等),里面包含了要在Ruby循环中快速运行的源代码。在Python中,我可以把这个字符串编译成一个抽象语法树,然后用eval()exec()来执行它:

# Python 3 example
given_code = 'n % 2 == 1'
pred = compile(given_code, '<given>', 'eval')
print("Passed:", [n for n in range(10) if eval(pred)])    
# Outputs: Passing members: [1, 3, 5, 7, 9]

但是Ruby没有编译函数,那我该怎么做才能实现这个呢?

2 个回答

1

我把整个字符串放在一个lambda里面(还是作为字符串),然后用eval来执行它,最后调用得到的Proc对象。

# XXX: Only runs on Ruby 1.8.7 and up.
given_code = 'n % 2 == 1'
pred = eval "lambda { |n| #{given_code} }"
puts 1.upto(10).select { |x| pred.call(x) } .inspect # Or (1..10).select for Ruby <= 1.8.6
# Output: [1, 3, 5, 7, 9]
7

这个内容是基于jhs的解决方案,但直接把lambda(一个小函数)用作循环的主体。这里的&是用来把这个lambda转换成一个可以被选择函数使用的块。

given_code = 'n % 2 == 1'
pred = eval "lambda { |n| #{given_code} }"
p all = (1..10).select(&pred)

撰写回答