У Ruby eval є вбудованою функцією, яка використовується для виконання рядків як Ruby-коду в контексті поточного об’єкта. Це дозволяє динамічно створювати та виконувати код під час виконання програми.
Виконання рядків як коду програми:
x = 10
eval("puts x + 5") # Виведе 15
Виконання рядків як виразів
result = eval("5 * 5") # result буде 25
Використання з локальними змінними
x = 10
eval("x = x + 5")
puts x # Виведе 15
Проте слід зазначити, що використання eval
пов’язане з ризиком безпеки, оскільки може дозволити виконання шкідливого коду, якщо введення не контролюється належним чином. Також воно може зробити код менш зрозумілим і важким у відлагодженні. Тому його слід використовувати з обережністю, і, якщо можна, уникати.
Типові ситуації, коли використання eval
може бути корисним.
Виконання коду, що містить рядкові шаблони або змінні, які потрібно вирішити під час виконання.
operation = "x + y"
x = 10
y = 5
result = eval(operation) # result буде 15
Іноді може бути необхідно створити методи під час виконання програми. eval
може допомогти у цьому.
method_name = "dynamic_method"
eval("def #{method_name}; puts 'Hello, world!'; end")
send(method_name) # Викличе метод dynamic_method і виведе "Hello, world!"
У випадках, коли програма має виконати деякий код, введений користувачем під час виконання.
user_input = gets.chomp
eval(user_input)
В деяких випадках метапрограмування, таке як динамічне створення класів або модулів, може потребувати використання eval
.
class_name = "MyClass"
eval("class #{class_name}; def hello; puts 'Hello, world!'; end; end")
obj = Object.const_get(class_name).new
obj.hello # Виведе "Hello, world!"