代码之家  ›  专栏  ›  技术社区  ›  0x.dummyVar

如何在Haxe中乘法字符串

  •  4
  • 0x.dummyVar  · 技术社区  · 8 年前

    我在试着乘以一些字符串 通过某个整数 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"
        }
    }
    
    5 回复  |  直到 7 年前
        1
  •  4
  •   tokiop    8 年前

    不是很短,但是 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
  •  4
  •   Gama11 zzapper    7 年前

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

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

    你可以通过操作员实现你想要的 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
  •  3
  •   bsinky    8 年前

    建立在 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

        4
  •  2
  •   Mark Knol    8 年前

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

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

    StringBuf可以针对不同的目标进行优化。例如,在JavaScript目标上,它的编译就像只使用字符串一样 https://api.haxe.org/StringBuf.html

        5
  •  0
  •   0x.dummyVar    7 年前

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

    public static inline function stringProduct ( s : String, n : Int ) {
    
        if ( n < 0 ) {
    
            throw ( 1 );
    
        }
    
        return StringTools.lpad ( "", s, s.length * n );
    
    }
    

    StringTools.lpad StringTools.rpad 似乎无法决定哪个更有效。对于较大的字符串,rpad可能更好,对于较小的字符串,lpad可能更好,但每次重新运行时,它们都会切换一点。 haxe.format.JsonPrinter 使用lpad进行连接,但我不确定推荐哪一种。