2017-12-31 22 views
3

Ich versuche, einige String ein durch eine ganze Zahl zu multiplizieren b so dass a * b = a + a + a ... (b mal). Ich habe versucht, es auf die gleiche Weise tun ich in Python würde:Haxe: Wie Zeichenkette multiplizieren

class Test { 
    static function main() { 
     var a = "Text"; 
     var b = 4;  
     trace(a * b); //Assumed Output: TextTextTextText 
    } 
} 

Aber dies wirft Build-Ausfall Test.hx: 6: Zeichen 14-15: String sollte Int. Es scheint, keine Informationen in der Haxe Programming Kochbuch oder die API-Dokumentation zu sein Strings zu multiplizieren, so frage ich mich, ob ich etwas falsch eingegeben haben oder wenn ich verwenden sollte:

class Test { 
    static function main() { 
     var a = "Text"; 
     var b = 4; 
     var c = ""; 

     for (i in 0...b) { 
      c = c + a; 
     } 
     trace(c); // Outputs "TextTextTextText" 
    } 
} 
+0

Ich habe meine Antwort mit einem Beispiel aktualisiert. – k0pernikus

Antwort

3

Nicht sehr kurz, aber array comprehension in einigen Situationen helfen könnten:

class Test { 
    static function main() { 
     var a = "Text"; 
     var b = 4; 
     trace([for (i in 0...b) a].join("")); 
     //Output: TextTextTextText 
    } 
} 

auf try.haxe.org See.

4

Der numerische Multiplikationsoperator * erfordert numerische Typen wie Integer. Du hast eine Zeichenfolge. Wenn Sie eine Zeichenfolge multiplizieren möchten, müssen Sie dies manuell tun, indem Sie eine Zielzeichenfolge innerhalb der Schleife anhängen.

Der Operator + ist nicht das numerische Plus in Ihrem Beispiel, aber eine Möglichkeit, Zeichenfolgen zu kombinieren.

können Sie erreichen, was Sie vom Betreiber wollen overloading:

abstract MyAbstract(String) { 
    public inline function new(s:String) { 
    this = s; 
    } 

    @:op(A * B) 
    public function repeat(rhs:Int):MyAbstract { 
    var s:StringBuf = new StringBuf(); 
    for (i in 0...rhs) 
     s.add(this); 
    return new MyAbstract(s.toString()); 
    } 
} 

class Main { 
    static public function main() { 
    var a = new MyAbstract("foo"); 
    trace(a * 3); // foofoofoo 
    } 
} 
3

Um auf tokiop's answer aufzubauen, können Sie auch eine times-Funktion definieren und sie dann als statische Erweiterung verwenden.

using Test.Extensions; 

class Test { 
    static function main() { 
     trace ("Text".times(4)); 
    } 
} 

class Extensions { 
    public static function times (str:String, n:Int) { 
     return [for (i in 0...n) str].join(""); 
    } 
} 

try.haxe.org demo here

2

Um auf bsinky Antwort zu erstellen, können Sie auch eine Zeit als statische Erweiterung definieren funktionieren, aber das Array vermeiden:

using Test.Extensions; 

class Test { 
    static function main() { 
     trace ("Text".times(4)); 
    } 
} 

class Extensions { 
    public static function times (str:String, n:Int) { 
     var v = new StringBuf(); 
     for (i in 0...n) v.add(str); 
     return v.toString(); 
    } 
} 

Demo: https://try.haxe.org/#e5937

StringBuf kann für verschiedene Ziele optimiert werden. Zum Beispiel, auf JavaScript-Ziel ist es kompiliert, als ob Sie nur mit Strings https://api.haxe.org/StringBuf.html