Как использовать классы Obj-C в MacRuby
Я пытаюсь использовать внешний класс Obj-C в своем проекте MacRuby, но не могу понять, как его импортировать. В частности, я хочу использовать ObjectiveResource внутри проекта MacRuby 0.5 (поскольку ActiveResource не работает - пока).
Я дошел до команды 'framework' в MacRuby, но, похоже, она применима только к реальным фреймворкам.
Вопросы: где я должен установить каталог цель-ресурс? как мне вытащить эти классы из моего кода ruby?
Спасибо за любую помощь!
3 ответа
Вы можете получить доступ к классу напрямую, используя ClassName.new.
Если у вас есть класс с именем Utilities в вашем проекте, и у него есть метод с именем приветствие:, вы бы назвали его так.
util = Utilities.new
puts util.greeting("Good morning")
Там не требуется или рамочные декларации требуется. Удивительно просто, не правда ли? Я обнаружил это, наблюдая за трансляцией Peepcode на MacRuby.
Также, если вы заинтересованы в вызове кода 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 - ваш друг в написании сигнатур методов в заголовочном файле.