Кроме того, если вы заинтересованы в вызове кода Ruby из Objective-c, вот выдержка из списка рассылки MacRuby:
После инициализации среды выполнения MacRuby вы можете получить доступ ко всем объектам Objective-C из Ruby. Например, если у вас есть класс Objective-C с именем Foo, вы можете сделать `Foo.new 'и т. Д.
Другая возможность - передать объекты Objective-C в метод Ruby с помощью [NSObject performRubySelector:]
.
рубин:
class Foo
def test(o)
o.something
end
end
ObjC:
MyObject *o = [MyObject new]; // where o responds to -something
MacRuby *runtime = [MacRuby sharedRuntime];
id foo_obj = [runtime evaluateString:@"new Foo"];
[foo_obj performRubySelector:@selector(test:) withArguments: o, NULL];
Проверьте весь API здесь: http://www.macruby.org/trac/browser/MacRuby/trunk/include/ruby/objc.h
Тема: http://lists.macosforge.org/pipermail/macruby-devel/2010-April/004715.html
(Изменить) Тем не менее, возможно, самый простой способ - добавить заголовочный файл для вашего файла ruby, содержащий эквиваленты ваших методов.
Предположим, у вас есть этот класс ruby:
class Foo
def bar(moo)
"a string like #{moo}"
end
end
поэтому эквивалентный заголовочный файл будет выглядеть примерно так:
@interface Foo : NSObject
- (NSString *)bar:(NSString *)moo
@end
Теперь, просто #import
заголовок и используйте ваши классы ruby в качестве стандартных классов Obj-C из кода Obj-C:
NSString *aString;
Foo *myFoo;
aString = [myFoo bar:@"me"];
Это может показаться странным, но это работает. По сути, идея заключается в том, чтобы закрыть рот компилятору и позволить ему компилировать ваш код, не жалуясь на отсутствующие методы. Затем, во время выполнения, он будет просто работать (я полагаю, благодаря динамической природе самого Obj-C). Кстати, чтобы имитировать поведение типа ruby без идентификаторов, id - ваш друг в написании сигнатур методов в заголовочном файле.