簡體   English   中英

如何在Haxe中乘以字符串

[英]How to multiply strings in Haxe

我試圖將一些字符串a乘以某個整數b ,使a * b = a + a + a ...(b次) 我嘗試過就像在python中一樣:

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

但這引起了:

構建失敗Test.hx:6:字符14-15:字符串應為Int

在Haxe Programming Cookbook或API Documentation中似乎沒有任何關於乘法字符串的信息,所以我想知道我輸錯了什么或者我應該使用:

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"
    }
}

數字乘法運算符*需要數字類型,如整數。 你有一個字符串。 如果要將字符串相乘,則必須通過在循環中追加目標字符串來手動執行此操作。

+運算符不是示例中的數字加號,而是組合字符串的一種方法。

你可以通過運算符重載實現你想要的:

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
    }
}

不是很短,但陣列理解可能在某些情況下有所幫助:

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

請參閱try.haxe.org

要構建tokiop的答案 ,您還可以定義times函數,然后將其用作靜態擴展。

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("");
    }
}

在這里試試.haxe.org演示

要構建bsinky答案,您還可以將時間函數定義為靜態擴展,但避免使用數組:

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();
    }
}

演示: https//try.haxe.org/#e5937

StringBuf可以針對不同的目標進行優化。 例如,在JavaScript目標上,它被編譯為好像您只是使用字符串https://api.haxe.org/StringBuf.html

最快的方法(至少在https://try.haxe.org/#195A8的JavaScript目標上)似乎使用StringTools._pad

public static inline function stringProduct ( s : String, n : Int ) {

    if ( n < 0 ) {

        throw ( 1 );

    }

    return StringTools.lpad ( "", s, s.length * n );

}

StringTools.lpadStringTools.rpad似乎無法決定哪個更有效。 看起來rpad對於較大的字符串可能更好,而對於較小的字符串,lpad可能更好,但是每次重新運行時它們會稍微切換一下。 haxe.format.JsonPrinter使用lpad進行連接,但我不確定要推薦哪個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM