Kernel#eval
eval(string[, binding, filename, lineno]) -> object Returns:
Object · Updated March 13, 2026 · Kernel Methods dynamic evaluation metaprogramming code
The eval method executes a string as Ruby code within a specified or current context. It provides dynamic code execution capabilities, useful for metaprogramming and runtime code generation.
Basic Usage
# Simple evaluation
eval("1 + 1") # => 2
# With local variables
x = 10
eval("x + 5") # => 15
With Binding
# Evaluate in a specific context
class Calculator
def initialize
@value = 100
end
end
calc = Calculator.new
eval("@value * 2", calc.binding) # => 200
Practical Examples
Dynamic Method Definition
# Define methods dynamically
methods = [:double, :triple]
methods.each do |name|
eval("def #{name}; @value * #{name.to_s[-1].to_i}; end")
end
Configuration Scripts
# config.rb
# database = "production"
# cache_ttl = 3600
eval(File.read("config.rb"))
puts database # => production
Template Engines
# Simple template
template = "Hello, <%= name %>!"
context = { name: "World" }
result = template.gsub(/<%=(.*?)%>/) { eval($1, context.binding) }
User Input as Code
# Calculator example
def calculate(expression)
# WARNING: Security risk!
eval(expression)
end
calculate("2 + 2") # => 4
calculate("10 / 2") # => 5
Security Warning
# DANGEROUS - Never eval untrusted input!
# eval(user_input) # Could run: `system("rm -rf /")`
Safer Alternatives
# Use RubyVM for safer evaluation (Ruby 2.7+)
require 'rubyvm'
# Or parse-only approach
RubyVM::InstructionSequence.compile("puts 'hi'")
With Filename and Line Number
# For better error messages
code = "undefined_var"
eval(code, binding, "script.rb", 10)
# Error points to script.rb:10
instance_eval vs eval
class MyClass
def initialize
@secret = 42
end
end
obj = MyClass.new
# eval in object's context
obj.instance_eval { @secret } # => 42
DSL Implementation
# Simple DSL
class Builder
def method_missing(name, *args)
puts "Building: #{name} with #{args.inspect}"
end
end
builder = Builder.new
eval("button 'Submit'", builder.binding)
eval is powerful but should be used sparingly due to security concerns. Prefer safer alternatives when possible.