Пользовательские инициализаторы MacRuby - PullRequest
0 голосов
/ 04 декабря 2010

Только что открыл 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", иEvenMore: "US"), среда выполнения взрывается, сообщая мне, что в суперспособлении Мунга, называемом initWithSomethingElse, не определено ни одного метода. истина, но это означает, что я не могу определить пользовательские инициализаторы в файлах ruby. Мой текущий обходной путь - предоставить однородный инициализатор, который принимает хэш, а затем отдельные подклассы анализируют хэш по мере необходимости. Мне не нравится этот подход, и я хотел бы : A. Объяснение того, почему initWithSomethingElse всегда вызывается на super, и B. Если прямое решение не может быть применено, альтернативный обходной путь. Спасибо, ребята!

1 Ответ

1 голос
/ 04 декабря 2010

Вы не можете вызвать супер версию другого метода, отличного от метода в MacRuby. Ключевое слово super учитывает семантику Ruby и отправляет вызов только супер версии текущего метода.

В вашем случае вы можете отправить initWithName: andLocation: andSomethingElse: непосредственно себе, и при необходимости вы можете переопределить этот селектор в классе и соответствующим образом вызвать super.

...