Как использовать классы Obj-C в MacRuby - PullRequest
2 голосов
/ 17 марта 2010

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

Я дошел до команды 'framework' в MacRuby, но, похоже, она применима только к реальным средам.

Вопросы: где я должен установить каталог цель-ресурс? как мне вытащить эти классы из моего кода ruby?

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

Ответы [ 3 ]

4 голосов
/ 02 мая 2010

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

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

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

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

3 голосов
/ 03 мая 2010

Кроме того, если вы заинтересованы в вызове кода 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 - ваш друг в написании сигнатур методов в заголовочном файле.

0 голосов
/ 17 марта 2010

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

...