ruby - Why can't I access local variable in the class_eval block? -


why not able access variable vehicle inside class_eval block:

class vehicle   def self.number_of_wheels     fail 'define in subclass'   end    def self.name     fail 'define in subclass'   end    def self.define_methods     number_of_wheels.times |index|       define_method("wheel_#{index}")         "this wheel #{index} of #{self.class.name}"       end     end   end end  klasses = %w(   tri_cycle   motor_boat ).map |vehicle| # variable want access   klass = class.new(vehicle)    klass.class_eval     def self.number_of_wheels       4     end      def self.name       vehicle # using string here work     end      define_methods   end    klass end  klasses.map { |k| k.new.wheel_1 } # =>  # ~> -:31:in `name': undefined local variable or method `vehicle' #<class:0x007ff6ea181800> (nameerror) # ~>    -:13:in `block (2 levels) in define_methods' # ~>    -:40:in `block in <main>' # ~>    -:40:in `map' # ~>    -:40:in `<main>' 

it's called "scope gate". local variables go out of scope definition of method, class or module begins. see book more in-depth info: https://pragprog.com/book/ppmetr2/metaprogramming-ruby-2

you can bypass using define_method or define_singleton_method (whatever suitable you) instead of def syntax (because method call, not method definition)


Comments