metaprogramming/class_exec_parens.rb
tests/_examples/metaprogramming/class_exec_parens.rb in the metorex repository.
# Module#class_exec / module_exec — block evaluated in the receiver's context,
# with the caller's arguments passed to the block. Written with explicit
# parentheses everywhere.
class Gadget
end
# Defines an instance method on the receiver.
Gadget.class_exec do
def name
"gadget"
end
end
puts(Gadget.new.name)
# Arguments are passed straight through to the block parameters.
puts(Gadget.class_exec(6, 7) { |a, b| a * b })
# Returns the block's last value.
puts(Gadget.class_exec { 1 + 1 })
# module_exec is the alias and behaves the same on a Module.
module Marker
end
Marker.module_exec("tag") do |label|
define_method(:label) { label }
end
class Holder
include Marker
end
puts(Holder.new.label)
# An instance of a Module subclass is itself a module and answers class_exec.
class NamedModule < Module
end
puts(NamedModule.new.class_exec { 40 + 2 })
Output:
gadget
42
2
tag
42