Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.ruby > #2927

Re: looking for an "inversion" pattern

From Robert Klemme <shortcutter@googlemail.com>
Newsgroups comp.lang.ruby
Subject Re: looking for an "inversion" pattern
Date 2011-04-15 04:24 -0500
Organization Service de news de lacave.net
Message-ID <BANLkTikFjzEuhMevuXJ6ZGSHA6h=MNTnjA@mail.gmail.com> (permalink)
References <d0c168880ff1c65dd84fc6d70778ddb2@ruby-forum.com> <7c9986702d2a6acd3748e6cca228d8da@ruby-forum.com>

Show all headers | View raw


On Fri, Apr 15, 2011 at 8:27 AM, Fearless Fool <r@alum.mit.edu> wrote:
> Fearless Fool wrote in post #992929:
>> Maybe I'm overthinking this...
>
> Meh.  I s'pose I can substitute an underscore for a period:
>
>  my_obj.foo_some_method(*args)
>
> ... whereupon this become a simple mixin on my_obj's class:
>
>  def foo_some_method(*args) {
>    MyClass.some_method(self, *args)
>  }
>
> The only potential disadvantage is that I need to write one of these for
> each method.  The advantages include likely to run much faster (than
> constructing lambdas or invoking method_missing processing) and possibly
> easier to understand and maintain than what I was originally trying to
> do.

I am sorry, I still do not understand your motivation to have a class
method which receives an instance as first argument.  Isn't this
conceptually exactly what an instance method is for?  Why do you need
this?

If you need this as general pattern you could always do

class X
  def method_missing(m, *a, &b)
    self.class.send(m, self, *a, &b)
  end

  def self.foo(obj, str)
    printf "%p: %s\n", obj, str
  end
end

X.new.foo 123

But I would seriously question the wisdom of this. :-)

Other than that I would follow Jesus's approach to make #foo create a
proxy instance.  Here's another way to do it which would also allow
method chaining on the proxy:

class Proxy < BasicObject
  def initialize(orig, delegate)
    @orig = orig
    @delegate = delegate
  end

  def method_missing(m, *a, &b)
    res = @delegate.send(m, @orig, *a, &b)
    @orig.equal?(res) ? self : res
  end
end

class Object
  # create proxy for delegation to given
  # instance
  def proxy(delegate)
    Proxy.new(self, delegate)
  end
end

class YourClass
  def proxy
    super(MyClass)
  end
end

Kind regards

robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Back to comp.lang.ruby | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

looking for an "inversion" pattern Fearless Fool <r@alum.mit.edu> - 2011-04-15 00:16 -0500
  Re: looking for an "inversion" pattern Fearless Fool <r@alum.mit.edu> - 2011-04-15 01:27 -0500
    Re: looking for an "inversion" pattern Robert Klemme <shortcutter@googlemail.com> - 2011-04-15 04:24 -0500
      Re: looking for an "inversion" pattern Fearless Fool <r@alum.mit.edu> - 2011-04-15 10:40 -0500
        Re: looking for an "inversion" pattern Robert Klemme <shortcutter@googlemail.com> - 2011-04-16 15:29 +0200
  Re: looking for an "inversion" pattern Kevin Mahler <kevin.mahler@yahoo.com> - 2011-04-15 02:14 -0500
    Re: looking for an "inversion" pattern Fearless Fool <r@alum.mit.edu> - 2011-04-15 02:43 -0500
      Re: looking for an "inversion" pattern Kevin Mahler <kevin.mahler@yahoo.com> - 2011-04-15 08:44 -0500
    Re: looking for an "inversion" pattern 7stud -- <bbxx789_05ss@yahoo.com> - 2011-04-16 13:20 -0500
      Re: looking for an "inversion" pattern 7stud -- <bbxx789_05ss@yahoo.com> - 2011-04-16 13:43 -0500
  Re: looking for an "inversion" pattern Jesús Gabriel y Galán <jgabrielygalan@gmail.com> - 2011-04-15 02:45 -0500
  Re: looking for an "inversion" pattern Brian Candler <b.candler@pobox.com> - 2011-04-16 16:14 -0500
    Re: looking for an "inversion" pattern Robert Klemme <shortcutter@googlemail.com> - 2011-04-16 23:40 +0200

csiph-web