From: 7stud -- Date: 2011-04-13T03:14:44+09:00 Subject: Re: Copying parameters to singleton class Lars Olsson wrote in post #992249: > Hello again! > I was fooling around with your original requirement: > I want to create a class method that takes a bunch > of options and returns a singleton class with those > options set, ...and I think I was probably running into the same problems you were: class Object def singleton_class class << self self end end end class Opportunities def self.using(options) # Store options in singleton class variable # @options and then return singleton class obj = self.new singleton = obj.singleton_class singleton.instance_variable_set(:@options, options) singleton.class_eval do #<----PROBLEM HERE def options @options end end singleton end end Foo = Opportunities.using(one: 1, two: 2, three: 3) Bar = Opportunities.using(four: 4, five: 5, six: 6) p Foo.options p Bar.options --output:-- prog.rb:37:in `
': undefined method `options' for #> (NoMethodError) The problem is that options() is an instance method of the singleton class, but in this line: Foo.options Foo is the singelton class, and therefore options() is being called as a class method of the singleton class. A class method of a singleton class??!! You can actually create such a thing in ruby: class Object def singleton_class class << self self end end end class Opportunities def self.using(options) # Store options in singleton class variable # @options and then return singleton class obj = self.new singleton = obj.singleton_class singleton.send(:instance_variable_set, :@options, options) singleton.singleton_class.class_eval do #<---SOLUTION*** def options @options end end singleton end end Foo = Opportunities.using(one: 1, two: 2, three: 3) Bar = Opportunities.using(four: 4, five: 5, six: 6) p Foo.options p Bar.options --output:-- {:one=>1, :two=>2, :three=>3} {:four=>4, :five=>5, :six=>6} -- Posted via http://www.ruby-forum.com/.