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.

See Also