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

Brian Genisio briangenisio at gmail.com
Thu Jul 22 10:10:00 EDT 2010


No, that is not sufficient, because it does not work.  Assuming the example
I posted, this code fails:

dynamic automatic = testObject.automatic;
dynamic manual = testObject.manual;

dynamic autoLength = automatic.Length;
dynamic manualLength = manual.Length; // RuntimeBinderException

`manual.Length` fails because `manual` is of type
`IronRuby.Builtins.RubyMethod` and `Length` is not defined.

This is my problem... since 'manual' is not exposed to .Net as a property,
it fails.

Brian

P.S. I REALLY appreciate you talking through this with me.

On Thu, Jul 22, 2010 at 10:01 AM, Curt Hagenlocher <curth at microsoft.com>wrote:

>  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?
>
> B
>
> On Thu, Jul 22, 2010 at 9:34 AM, Brian Genisio <briangenisio at gmail.com>
> wrote:
>
> Curt,
>
>
>
> 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.
>
>
>
> Brian
>
> On Thu, Jul 22, 2010 at 9:17 AM, Curt Hagenlocher <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] *On Behalf Of *Brian Genisio
> *Sent:* Thursday, July 22, 2010 5:49 AM
> *To:* 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?
>
> Thanks,
>
> Brian
>
>
>
> On Wed, Jul 21, 2010 at 12:34 PM, Brian Genisio <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
>           @manual
>         end
>
>         def manual=(val)
>           @manual = val
>         end
>
>         def initialize
>           @automatic = ""testing""
>           @manual = ""testing""
>         end
>       end
>
>       Test.new
>     ";
>     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?
>
> Thanks,
> Brian
>
>
>
>
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
>
>
>
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20100722/dfdddd84/attachment.html>


More information about the Ironruby-core mailing list