Скомпилируйте строку в байт-код Ruby для лучшей производительности - как compile () в Python - PullRequest
4 голосов
/ 14 декабря 2009

У меня есть строка (аутентифицированная, доверенная и т. Д.), Содержащая исходный код, предназначенный для быстрой работы внутри цикла 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 ]

7 голосов
/ 14 декабря 2009

На основе решения jhs, но непосредственно с использованием лямбды в качестве тела цикла (& вызывает to_proc для лямбды и передает ее как блок функции выбора).

given_code = 'n % 2 == 1'
pred = eval "lambda { |n| #{given_code} }"
p all = (1..10).select(&pred)
1 голос
/ 14 декабря 2009

Я обертываю всю строку в лямбду (все еще как строку), вычисляю ее и затем вызываю результирующий объект 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]
...