------ art_1576_24643030.1134634661329
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Oops...
In the :Count method I defined, self isn't the same as in the method you
defined.
caller[1] probably would be the object you are looking for as long as that
method gets called through :method_missing in this case. :self could be used
if the dynamic method is defined in the class though.
d.dynamic_methods[:Count] = lambda do |*args|
create_ruby_instance_method(caller[1].class, 'Count') do
include 'System.Collections'
ldarg_2
call 'static Marshal::ToClrObject(VALUE)'
call 'ArrayList::get_Count()'
call 'static Marshal::ToRubyNumber(Int32)'
ret
end
caller[1].Count
end
--
Brian Takita
http://freeopinion.org
On 12/14/05, Brian Takita <brian.takita / gmail.com> wrote:
>
> Hello John,
>
> This isn't quite as cool as a prototype, but here is another possible type
> of solution:
>
> class Dynamic
> attr_reader :dynamic_methods
>
> def initialize
> @dynamic_methods = Hash.new
> end
>
> alias alias_method_missing method_missing
>
> def method_missing(name, *args)
> unless @dynamic_methods.include?(name)
> alias_method_missing(name, *args)
> return
> end
>
> @dynamic_methods[name].call(*args)
> end
> end
>
> d = Dynamic.new
>
> # You can also use Proc.new instead of lambda
> d.dynamic_methods[:test] = lambda do |*args|
> puts 'test ' + args.to_s
> end
>
> d.test(1, 2)
> # test 12
>
> Of course you could add the method that you describe in your link:
>
> d.dynamic_methods[:Count] = lambda do |*args|
> create_ruby_instance_method( self.class, 'Count') do
> include 'System.Collections'
> ldarg_2
> call 'static Marshal::ToClrObject(VALUE)'
> call 'ArrayList::get_Count()'
> call 'static Marshal::ToRubyNumber(Int32)'
> ret
> end
> self.Count
> end
>
> --
> Brian Takita
> http://freeopinion.org
>
> On 12/14/05, Eero Saynatkari <ruby-forum-reg / mailinator.com> wrote:
> >
> > John Lam wrote:
> > > I just finished writing the first spike for my Ruby CLR bridge
> > tonight,
> > > and
> > > I'm wondering if there might be a better (or more efficient) way to
> > add
> > > instance methods to a class object than this:
> > >
> > > class Module
> > > def const_missing(symbol)
> > > obj = Class.new
> > > obj.class_eval %{
> > > def initialize
> > > ...
> > > end
> > >
> > > def method_missing(name, *params)
> > > ...
> > > end
> > > }
> > > const_set(symbol, obj)
> > > end
> > > end
> >
> > Not really, except for using define_method (which has
> > some limitations that would probably make it unsuitable
> > for a #method_missing implementation). The 'Class methods'
> > thread had pretty much this exact implementation..
> >
> > Perhaps some sort of a prototype-based approach?
> >
> > > Thanks,
> > > -John
> > > http://www.iunknown.com
> > >
> > > PS If you're wondering what the code in the ... blocks do, read my
> > > write-up
> > > of this code at:
> > > http://www.iunknown.com/articles/2005/12/14/hello-rubyclr
> >
> >
> > E
> >
> > --
> > Posted via http://www.ruby-forum.com/.
> >
> >
>
>
------ art_1576_24643030.1134634661329--