How to know if a method is read-write or read-only

Discussion in 'Ruby' started by Trans, Dec 18, 2005.

  1. Trans

    Trans Guest

    I've now come across a second usecase for knowing if a method is
    read-write or read-only on it's object's state. Both cases boil-down to
    having meta-method behave differently depending on the behavior of
    method being delegated to, but the circumstances differ completely. To
    give an example, the current case generates method wraps for any given
    class, applying thread sycronization. If a method is read-only it's
    wraped in a Sync::SH, if read-write then Sync::Ex.

    So I wonder, is there a way to determine this fact about a method?

    Thanks,
    T.
    Trans, Dec 18, 2005
    #1
    1. Advertising

  2. I assume you mean methods that are property getters/setters, along the
    lines of 'user.name()'/'user.name=3D(name)', and that read-write or
    read-only refer to object properties like 'name'?

    There is no general way to determine whether a method updates object
    state or not. (Unless you start parsing bytecodes or hook into the VM
    parse tree, which is a somewhat larger project.)
    You'll have to rely on naming conventions, like "a method that takes
    no arguments and has a name not ending with '=3D' is a getter, a method
    that takes one argument and has a name ending with '=3D' is a setter".

    You can get the number of arguments from Method#arity, like
    Array.instance_method:)length).arity
    =3D> 0

    jf

    On 12/18/05, Trans <> wrote:
    > I've now come across a second usecase for knowing if a method is
    > read-write or read-only on it's object's state. Both cases boil-down to
    > having meta-method behave differently depending on the behavior of
    > method being delegated to, but the circumstances differ completely. To
    > give an example, the current case generates method wraps for any given
    > class, applying thread sycronization. If a method is read-only it's
    > wraped in a Sync::SH, if read-write then Sync::Ex.
    >
    > So I wonder, is there a way to determine this fact about a method?
    >
    > Thanks,
    > T.
    Johannes Friestad, Dec 19, 2005
    #2
    1. Advertising

  3. Trans wrote:
    > I've now come across a second usecase for knowing if a method is
    > read-write or read-only on it's object's state. Both cases boil-down to
    > having meta-method behave differently depending on the behavior of
    > method being delegated to, but the circumstances differ completely. To
    > give an example, the current case generates method wraps for any given
    > class, applying thread sycronization. If a method is read-only it's
    > wraped in a Sync::SH, if read-write then Sync::Ex.
    >
    > So I wonder, is there a way to determine this fact about a method?
    >
    > Thanks,
    > T.
    >

    Do you want to know if a method changes its object's state? In that
    case, you could duplicate the object, freeze the duplicate and try to
    call the method. If an Exception is raised, then either the method has a
    bug or it is state-changing.

    class Object
    def changes_state?(method)
    self.dup.freeze.send(method)
    return false
    rescue TypeError
    return true
    end
    end

    "foo".changes_state? :upcase => false
    "foo".changes_state? :upcase! => true

    It would be nice if a special exception was thrown when attempting to
    call a method on a frozen object, so that you could distinguish it from
    the usual TypeErrors.

    Note that this method isn't very efficient, since it duplicates the
    entire object on each invocation. If you were to check many methods on a
    single object, you might want to keep the frozen duplicate in an
    instance variable.


    Cheers,
    Daniel
    Daniel Schierbeck, Dec 19, 2005
    #3
  4. Trans

    Trans Guest

    Thanks Daniel. That's an interesting approach --probably the best
    automatic way that can be done.

    But I think for a practical approach I will have to create some sort of
    annotation declaration and simply manually declare methods as read-only
    vs. read-write. Not ideal, of course, but at least it will work
    efficiently.

    Thanks,
    T.
    Trans, Dec 21, 2005
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Isaac
    Replies:
    0
    Views:
    2,450
    Isaac
    Jul 10, 2003
  2. Lasse Laegteskov
    Replies:
    1
    Views:
    484
    Rune Berge
    Jun 1, 2004
  3. keithb
    Replies:
    2
    Views:
    7,991
    keithb
    Jun 7, 2006
  4. A
    Replies:
    1
    Views:
    315
    Ian Collins
    Nov 3, 2010
  5. Andries

    I know, I know, I don't know

    Andries, Apr 23, 2004, in forum: Perl Misc
    Replies:
    3
    Views:
    223
    Gregory Toomey
    Apr 23, 2004
Loading...

Share This Page