eval/eval_scope_and_returns_no_parens.rb
tests/_examples/eval/eval_scope_and_returns_no_parens.rb in the metorex repository.
# The same run of eval written without parentheses.
class Cabinet
def stock
eval "class Shelf; end"
Shelf.name
end
end
p Cabinet.new.stock
p Kernel.eval "self"
p Kernel.respond_to? :eval
p method(:eval).call "2 * 3"
class Speaker
def self.say
yield
end
end
begin
eval("Speaker.say") { "from the block" }
rescue LocalJumpError => refused
p refused.class
end
answer = -> do
proc do
eval "return :from_the_eval"
end.call
:never_reached
end.call
p answer
begin
proc { eval "return :nowhere" }.call
rescue LocalJumpError => stranded
p stranded.class
end
held = binding
eval "if false; counted = 1; end", held
p eval("counted", held)
source = <<SOURCE.b
# encoding: UTF-8
class Cabinet
Widthπ = 12
end
SOURCE
p source.encoding
eval source
p Cabinet.constants(false).include? :"Widthπ"
p Cabinet::Widthπ
class Coerced
def to_str
"6 * 7"
end
end
p eval Coerced.new
begin
eval "1", proc {}
rescue TypeError => refused
p refused.message
end
Output:
"Cabinet::Shelf"
Kernel
true
6
LocalJumpError
:from_the_eval
LocalJumpError
nil
#<Encoding:BINARY (ASCII-8BIT)>
true
12
42
"wrong argument type proc (expected binding)"