如何在Haxe中乘以字符串

时间:2017-12-31 21:28:03

标签: 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
    }
}

但这提出了:

  

构建失败Test.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"
    }
}

5 个答案:

答案 0 :(得分:4)

数字乘法运算符let html = ""; let rgbColor; let randomColors = (red, green, blue) => { for (let i = 1; i <= 10; i++) { red = Math.floor(Math.random() * 256); green = Math.floor(Math.random() * 256); blue = Math.floor(Math.random() * 256); rgbColor = `rgb(${red},${green},${blue})`; html += `<div style="background-color:${rgbColor}"></div>`; } document.write(html); } randomColors() 需要数字类型,如整数。你有一个字符串。如果要将字符串相乘,则必须通过在循环中附加目标字符串来手动完成。

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

您可以通过运营商overloading实现您想要的目标:

+

答案 1 :(得分:3)

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

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

try.haxe.org

答案 2 :(得分:3)

要在tokiop's answer上构建,您还可以定义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("");
    }
}

try.haxe.org demo here

答案 3 :(得分:2)

要构建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

一样

答案 4 :(得分:0)

最快的方法(至少在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进行串联,但是我不确定该推荐哪个。