我正在尝试在我的MacRuby项目中使用外部Obj-C类,但我无法弄清楚如何导入它。具体来说,我想在MacRuby 0.5项目中使用ObjectiveResource(因为ActiveResource不起作用)。
我已经获得了MacRuby中的'framework'命令,但它似乎只适用于实际的框架。
问题:我应该在哪里安装objective-resource目录?如何在我的ruby代码中提取这些类?
感谢您的帮助!
答案 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包的示例?