String 如何在Haxe中乘法字符串

String 如何在Haxe中乘法字符串,string,haxe,String,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 } } 但这引发了: 生成失败测试。hx:6:字符14-15:字符串应为Int

我试着用一些字符串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
    }
}
但这引发了:

生成失败测试。hx:6:字符14-15:字符串应为Int

Haxe编程手册或API文档中似乎没有关于字符串乘法的任何信息,因此我想知道是否输入了错误的内容,或者是否应该使用:

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

数字乘法运算符
*
需要数字类型,如整数。你有一根绳子。如果要将字符串相乘,则必须通过在循环中追加目标字符串手动执行

+
运算符不是示例中的数字加号,而是组合字符串的一种方法

您可以通过操作员实现您想要的:

不是很短,但在某些情况下可能会有所帮助:

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

若要在此基础上构建,还可以定义一个
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("");
    }
}

要在bsinky answer的基础上构建,还可以将times函数定义为静态扩展,但避免使用数组:

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

StringBuf可以针对不同的目标进行优化。例如,在JavaScript目标上,它被编译为只使用字符串

最快的方法(至少在来自的JavaScript目标上)似乎是使用
StringTools

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

    if ( n < 0 ) {

        throw ( 1 );

    }

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

}
公共静态内联函数stringProduct(s:String,n:Int){
if(n<0){
投掷(1);
}
返回StringTools.lpad(“,s,s.length*n);
}
StringTools.lpad
StringTools.rpad
似乎无法决定哪个更有效。对于较大的字符串,rpad可能更好,对于较小的字符串,lpad可能更好,但每次重新运行时,它们都会切换一点
haxe.format.JsonPrinter
使用lpad进行连接,但我不确定推荐哪一种

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

    if ( n < 0 ) {

        throw ( 1 );

    }

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

}