--- Robert Klemme <bob.news / gmx.net> wrote:
> Eric Mahurin wrote:
> > Regarding duck-typing... Is there an easy way make a
> "duck"?
> > i.e. an object that responds to enough methods to be an
> > acceptable argument to a certain methods. For example, if
> I
> > have a method that takes aString and uses the #size and
> #[i]
> > methods, I could pass it something that looked just enough
> like
> > a String to work:
> >
> > alphabet = Object.duck(:[],proc{|i|?a+i},:size,proc{26})
>
> Why aren't you satisfied with
>
> class Alpha
> def [](i) ?a+i end
> def size() 26 end
> end
> alphabet = Alpha.new
>
> or
>
> alphabet = Object.new
> def alphabet.[](i) ?a+i end
> def alphabet.size() 26 end
>
> You can even squeeze that on one line if you feel the need
> for it. I
> mean, you don't generate those methods dynamically or get
> them from
> somewhere else so why not just use the std approach?
For the example I gave above, I think you are correct. The
examples I gave in response to David Black are probably better
ones. With those, a simple "def" won't cut it. You need
define_method. But, using define_method is cumbersome from an
object because you first need to make it have a singleton
class, then use "send" to access it from that class because it
it a private method. Another solution to the problem of
"making a duck" would be to have a
Object#define_singleton_method:
class Object
def define_singleton_method(name,&block)
klass = (class << self;self;end)
klass.send(:define_method,name,&block)
self
end
end
Then, for example, you could do this to make a set be useful
for a method that uses == for comparison:
seteq = Object.new.
define_singleton_method(:==,&set.method(:include?))
I'm not sure why this isn't in Object right now. It seems like
the rest of the *singleton_method* methods are there.
__________________________________
Discover Yahoo!
Find restaurants, movies, travel and more fun for the weekend. Check it out!
http://discover.yahoo.com/weekend.html