Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling IronRuby from C# with a delegate

Is it possible to call an IronRuby method from C# with a delegate as parameter in such a way that yield would work?

The following gives me a wrong number of arguments (1 for 0) exception.

Action<string> action = Console.WriteLine;
var runtime = Ruby.CreateRuntime();
var engine = runtime.GetEngine("rb");
engine.Execute(@"
                 class YieldTest
                   def test
                     yield 'From IronRuby'
                   end
                 end
                ");
object test = engine.Runtime.Globals.GetVariable("YieldTest");
dynamic t = engine.Operations.CreateInstance(test);
t.test(action);
like image 784
Jonas Elfström Avatar asked Nov 06 '22 06:11

Jonas Elfström


2 Answers

I'm sure Ruby's block is not a c# delegate.
If you pass delegate to Ruby you should invoke it via delegate's Invoke method.
Here is sample code:

var rt = Ruby.CreateRuntime();
var eng = rt.GetEngine("rb");
eng.Execute(@"
            class Blocktest
              def test(block)
                block.Invoke('HELLO From IronRuby')
              end
            end
            ");
dynamic ruby = eng.Runtime.Globals;
dynamic t = ruby.Blocktest.@new();
t.test(new Action<string>(Console.WriteLine));

Can we convert c# delegate into ruby block... I don't know.

like image 112
Sergey Mirvoda Avatar answered Nov 12 '22 10:11

Sergey Mirvoda


Got an answer by IronRuby core team member Tomáš Matoušek on the IronRuby-core list that it's not possible. Yet.

like image 41
Jonas Elfström Avatar answered Nov 12 '22 11:11

Jonas Elfström