Про використання eval в Ruby

У 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!"