[Ironruby-core] Why does attr_accessor create a property, but method is just a method?

Curt Hagenlocher curth at microsoft.com
Thu Jul 22 10:01:47 EDT 2010

WPF binds by effectively treating the Ruby object as "dynamic" - that is, it goes through IDynamicMetaObjectProvider. You can get the same behavior from C# by saying

dynamic obj = SomeRubyObject();
dynamic foo = obj.foo;

Is this not sufficient for your needs?

From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Brian Genisio
Sent: Thursday, July 22, 2010 6:55 AM
To: ironruby-core at rubyforge.org
Subject: Re: [Ironruby-core] Why does attr_accessor create a property, but method is just a method?

Thinking on this further, if there were some sort of interop-specific class method... like attr_clr_property :foo, that caused any methods named foo and foo=(var) to be visible to .Net as properties, that would be sufficient.

Any thoughts on this?
On Thu, Jul 22, 2010 at 9:34 AM, Brian Genisio <briangenisio at gmail.com<mailto:briangenisio at gmail.com>> wrote:

Thank you very much for engaging :)

Although I understand what you are saying, from an interop perspective, this is not desirable.

In fact, the WPF binding system will see two methods (foo and foo=(val)) and determine that they are properties that can be bound to.  C#, on the other hand, can't use them as properties.  Furthermore, if I want a simple side effect (like property change notification) in a property, it makes sense for me to define my own foo and foo=(val) methods.  Again, WPF can get these notifications and read the "properties", but C# just sees methods.  Another case might be where properties are just wrappers around hashes... a case I am running into.

At a very minimum, I would expect to be able to create get_foo and set_foo(value) in ruby to have them be seen as .Net properties, but this doesn't seem to work either.

In general, I am trying to understand good interop practices between my ruby and C# and WPF code, but I can't seem to make anything other than attr_accessor work.

On Thu, Jul 22, 2010 at 9:17 AM, Curt Hagenlocher <curth at microsoft.com<mailto:curth at microsoft.com>> wrote:
I believe this works as designed.

The problem is that Ruby doesn't otherwise distinguish syntactically between a property and a method with no parameters. Imagine that you're in tooling such as Visual Studio. By default, the values of properties are automatically displayed in the debugger and in tool tips. But if I happen to have a no-args method named format_cdrive, I probably don't want that code to be run just to inspect its value. Effectively, attr_accessor, attr_reader and attr_writer are used by IronRuby as signals that indicate this operation is free of potentially-nasty side effects.

From: ironruby-core-bounces at rubyforge.org<mailto:ironruby-core-bounces at rubyforge.org> [mailto:ironruby-core-bounces at rubyforge.org<mailto:ironruby-core-bounces at rubyforge.org>] On Behalf Of Brian Genisio
Sent: Thursday, July 22, 2010 5:49 AM
To: ironruby-core at rubyforge.org<mailto:ironruby-core at rubyforge.org>
Subject: Re: [Ironruby-core] Why does attr_accessor create a property, but method is just a method?

So, I haven't heard anything about this yet on Stack Overflow, or this list.

Does anyone know if this is this a bug in IronRuby interop?

On Wed, Jul 21, 2010 at 12:34 PM, Brian Genisio <briangenisio at gmail.com<mailto:briangenisio at gmail.com>> wrote:
This is a cross-post from Stack Overflow, but I haven't heard a peep there, so I figured I'd try here:

I am playing around with the interop between C# and IronRuby.  I have noticed that if I define a property in Ruby using `attr_accessor`, it is presented to C# as a property.  If, on the other hand, I create the exact same code manually, it comes back as a method.

For example, take this code:

    var engine = IronRuby.Ruby.CreateEngine();
    string script = @"
      class Test
        attr_accessor :automatic

        def manual

        def manual=(val)
          @manual = val

        def initialize
          @automatic = ""testing""
          @manual = ""testing""

    var testObject = engine.Execute(script);

    var automatic = testObject.automatic;
    var manual = testObject.manual;

When you look at the C# `automatic` variable, the value is a string of "testing".  If you look at the C# `manual` variable, it is type IronRuby.Builtins.RubyMethod.

Ultimately, I want to create my own properties in Ruby that can be used in C#, but I can't seem to make them be visible as properties like `attr_accessor` does.

I THINK, that there is some magic going on in the Module code of the Ruby source code (ModuleOps.cs:DefineAccessor).  Is there any way to do this in Ruby code directly?


Ironruby-core mailing list
Ironruby-core at rubyforge.org<mailto:Ironruby-core at rubyforge.org>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20100722/93d24416/attachment-0001.html>

More information about the Ironruby-core mailing list