Hi John,

Ruby has method_missing instead of __getattr__.

Method_missing also fills __setattr__'s shoes. Python calls __getattr__ only
when it can't find the attribute, but it calls __setattr__ for every attempt
to set a value. Instance variables in Ruby are private, so they can  only
only be manipulated through setter methods. This means that an attempt to
set a variable, "value", for object obj with "obj.value = 5" is really
calling the method "value=" on obj, passing an argument of 5. So this will
also result in a call to method_missing if there is no "value=" method.

Here's an example:

class Foo
    def initialize
        @value = 5
    end

    def method_missing(symbol, *args)
        if symbol == :value
            @value
        elsif symbol == :value=
            @value = args[0]
        end
    end
 end


f = Foo.new
print f.value.to_s + "\n"
f.value = 10
print f.value.to_s + "\n"

Yields:
5
10


Most if not all of Python's operator overloading can be handled in Ruby
also. For instance:

def __getitem__(self, i) -> def [](i)
def __setitem__(self, i, value) -> def[]=(i, value)
def __add__(self, other) -> def +(other)

Interestingly, [] covers __getslice__, too, since it's written to take
either an integer, a Range object, or a pair of integers representing start
and length.

Hope that helps,

Bryn

----- Original Message -----
From: "Johann Hibschman" <johann / physics.berkeley.edu>
To: "ruby-talk ML" <ruby-talk / netlab.co.jp>
Sent: Sunday, January 28, 2001 1:40 PM
Subject: [ruby-talk:10037] dumb python-y question


> Hi folks,
>
> I'm a long-time python-head, just playing with Ruby for fun, and I was
> wondering if there was anything in Ruby similar to the __getattr__
> special method in Python.
>
> __getattr__ is called whenever there is an attempt to look up an
> attribute that fails.  I use it to implement wrappers over C-objects
> in a concise manner when performance isn't important, such as in:
>
> class ObjMirror:
>   meths = ["x", "y", "name", "state"]
>   def __init__(self, obj):
>      self.obj = obj
>   def __getattr__(self, attr):
>     if attr in self.meths:
>       fcn_name = "obj_get_"+attr
>       return (getattr(obj_module, fcn_name))(self.obj)
>
> That's just one example.  It comes up every now and then.  Is Ruby
> too disciplined for this, or is there a way around that?
>
> --Johann
>
> --
> Johann Hibschman                           johann / physics.berkeley.edu
>