如何在MacRuby中使用Obj-C类

时间:2010-03-17 10:31:02

标签: objective-c macruby

我正在尝试在我的MacRuby项目中使用外部Obj-C类,但我无法弄清楚如何导入它。具体来说,我想在MacRuby 0.5项目中使用ObjectiveResource(因为ActiveResource不起作用)。

我已经获得了MacRuby中的'framework'命令,但它似乎只适用于实际的框架。

问题:我应该在哪里安装objective-resource目录?如何在我的ruby代码中提取这些类?

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

您可以使用ClassName.new直接访问该类。

如果您的项目中有一个名为Utilities的类,并且它有一个名为greeting:的方法,您可以这样调用它。

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

不需要要求或框架声明。非常简单不是它。我发现这是在MacRuby上观看Peepcode截屏视频。

答案 1 :(得分:3)

此外,如果您有兴趣从Objective-c调用Ruby代码,这里是MacRuby邮件列表的摘录:

初始化MacRuby运行时后,您可以从Ruby访问所有Objective-C对象。例如,如果你有一个名为Foo的Objective-C类,你可以做`Foo.new'等。

另一种可能性是使用[NSObject performRubySelector:]将Objective-C对象传递给Ruby方法。

红宝石:

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标题,并在你的Obj-C代码中使用ruby类作为标准的Obj-C:

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

这可能看起来很奇怪,但它确实有效。从本质上讲,这个想法是关闭编译器的口,让它编译你的代码而不抱怨缺少方法。然后,在运行时,它将工作(我想由于Obj-C本身的动态性质)。顺便说一句,为了模仿ruby无类型行为,id是你在头文件中编写方法签名的朋友。

答案 2 :(得分:0)

您是否看过this创建ObjC包的示例?