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
Post a Comment