【问题标题】:MacRuby custom initializersMacRuby 自定义初始化器
【发布时间】:2011-05-20 03:35:40
【问题描述】:

今天下午刚发现 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 的 super 中没有定义名为 'initWithSomethingElse' 的方法。这是是的,但这意味着我无法在 ruby​​ 文件中定义自定义初始化程序。我目前的解决方法是提供一个采用哈希的同质初始化程序,然后各个子类根据需要解析哈希。我不喜欢这种方法并且想要:A. 解释为什么在 super 上调用 'initWithSomethingElse',以及 B. 如果无法应用直接解决方案,另一种解决方法。谢谢大家!

【问题讨论】:

    标签: objective-c ruby macos scripting macruby


    【解决方案1】:

    您不能从 MacRuby 中的方法调用不同方法的超级版本。 super 关键字尊重 Ruby 语义,并且只会调度对当前方法的超级版本的调用。

    在您的情况下,您可能希望将 initWithName:andLocation:andSomethingElse: 直接发送给 self,如果需要,您可以在类上重新定义此选择器并适当地调用 super。

    【讨论】:

    • 好吧,我觉得自己很傻。昨晚睡觉后我什至想到了这个解决方案。绝对应该先给自己打电话……谢谢你的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多