今天下午刚刚发现MacRuby;男人真是太酷了!但是,我试图用一些MacRuby-fu扩展一个旧项目时遇到了一些困难。这是交易:
所以我在Objective-C中有一个超类,如下所示:
@implementation Foo
- (id) init {
if (self = [super init]) {
//Do nothing, don't have enough data...
}
return self;
}
- (id) initWithName:(NSString*)n andLocation:(NSString*)loc andSomethingElse:(Bar*)b {
if (self = [super init]) {
//Set a LOT of internal state...
}
return self;
}
@end
所以,在ruby文件中,我们将其称为Mung.rb,如下所示:
class Mung < Foo
def initWithSomethingElse(else, andEvenMore:more)
super.initWithName("Moop", andLocation:else, andSomethingElse:more.addVal(42))
self
end
end
当我去实例化一个Mung(myObj = Mung.alloc.initWithSomethingElse(“Boo”,andEvenMore:“US”)时,运行时爆炸告诉我在Mung的超级中没有定义一个名为'initWithSomethingElse'的方法。这是是的,但这意味着我无法在ruby文件中定义自定义初始化器。我目前的解决方法是提供一个带有哈希的同源初始化器,然后各个子类根据需要解析哈希。我不喜欢这种方法并希望:A。解释为什么'initWithSomethingElse'被称为超级和B.如果没有直接解决方案可以应用,另一种解决方法。谢谢你们!
答案 0 :(得分:1)
您无法从MacRuby中的方法调用其他方法的超级版本。 super关键字尊重Ruby语义,只会调用当前方法的超级版本。
在您的情况下,您可能希望直接将initWithName:andLocation:andSomethingElse:发送给self,如果需要,您可以在类上重新定义此选择器并适当调用super。