0

今日の午後、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ファイルでカスタム初期化子を定義できないことを意味します。現在の回避策は、ハッシュを取得する同種の初期化子を提供し、個々のサブクラスが必要に応じてハッシュを解析することです。このアプローチは好きではないので、次のようにします。 'initWithSomethingElse'がsuperで呼び出される理由の説明、およびB.直接的な解決策を適用できない場合は、別の回避策。ありがとうございます。

4

1 に答える 1

1

MacRubyのメソッドとは異なるメソッドのスーパーバージョンを呼び出すことはできません。superキーワードは、Rubyセマンティクスを尊重し、現在のメソッドのスーパーバージョンへの呼び出しのみをディスパッチします。

あなたの場合、initWithName:andLocation:andSomethingElse:を直接自分自身に送信したいと思うかもしれません。必要に応じて、クラスでこのセレクターを再定義し、superを適切に呼び出すことができます。

于 2010-12-04T10:57:07.097 に答える