将字符串编译为Ruby字节码以提高性能 — 类似于Python中的compile()
我有一段字符串(比如“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)