2010-03-17 3 views
2

Я пытаюсь использовать внешний класс Obj-C в моем проекте MacRuby, но я не могу понять, как его импортировать. В частности, я хочу использовать ObjectiveResource внутри проекта MacRuby 0.5 (поскольку ActiveResource еще не работает).Как использовать классы Obj-C в MacRuby

Я добрался до команды «framework» в MacRuby, но, похоже, это применимо только к реальным фреймворкам.

Вопросы: где я должен установить каталог объектных ресурсов? как мне потянуть эти классы внутри моего рубинового кода?

Спасибо за помощь!

ответ

0

Вы посмотрели на this пример создания пакета ObjC?

+0

Да, я пробовал это, но я вообще не работаю для меня. Я немного приблизился, создав пакет вручную в соответствии с этим (http://www.mail-archive.com/[email protected]/msg00940.html), но это очень болезненный процесс и я не совсем получил работу. Я полагаю, что код ObjectiveResource (предназначенный для iPhone-приложений) не подходит для этого? – beno1604

+1

Какие ошибки вы получаете при попытке расслоения? Можете ли вы отредактировать сообщение, чтобы включить сообщения об ошибках? – sal

4

Вы можете получить доступ к классу напрямую, используя ClassName.new.

Если у вас есть класс с именем Utilities в вашем проекте, и у него есть метод с именем greeting :, вы бы назвали его так.

util = Utilities.new 
puts util.greeting("Good morning") 

Требований о необходимости или рамочной декларации не требуется. Удивительно просто, не так ли. Я обнаружил это, наблюдая за скринкастом Peepcode на MacRuby.

3

Кроме того, если вы заинтересованы в вызове Ruby-код из Objective-C, вот отрывок из списка рассылки MacRuby:

После выполнения MacRuby инициализации, вы можете получить доступ ко всем объектам вашей Objective-C из Рубин. Например, если у вас есть класс 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

(Edit) Тем не менее, возможно, самый простой путь - добавить заголовочный файл для вашего рубинового файла, содержащий ваш метод ds эквивалентов.

Предположим, что у вас есть этот рубин класс:

class Foo 
    def bar(moo) 
    "a string like #{moo}" 
    end 
end 

поэтому эквивалентный заголовочный файл будет что-то вроде этого:

@interface Foo : NSObject 
- (NSString *)bar:(NSString *)moo 
@end 

Теперь, только #import заголовок и использовать классы рубин в качестве стандартного Obj-C из вашего кода Obj-C:

NSString *aString; 
Foo *myFoo; 
aString = [myFoo bar:@"me"]; 

Это может показаться странным, но оно работает. По сути, идея состоит в том, чтобы закрыть рот компилятора и позволить ему скомпилировать ваш код, не жалуясь на недостающие методы.Затем во время работы он будет работать (я полагаю, благодаря динамической природе самого Obj-C). Кстати, чтобы имитировать румяное беспричинное поведение, id - ваш друг в написании меток подписи в файле заголовка.