Библиотеки C ++, которые реализуют горутины Go или каналы Go?

Забавно, потому что Stack & nbsp; Overflow на самом деле имеет свою собственную функцию форматирования для прототипа String под названием formatUnicorn. Попытайся! Войдите в консоль и введите что-то вроде:

"Hello, {name}, are you feeling {adjective}?".formatUnicorn({name:"Gabriel", adjective: "OK"});

Firebug

Вы получите следующий вывод:

Hello, Gabriel, are you feeling OK?

Вы можете использовать объекты, массивы и строки в качестве аргументов! Я получил его код и переработал его для создания новой версии String.prototype.format:

String.prototype.formatUnicorn = String.prototype.formatUnicorn ||
function () {
    "use strict";
    var str = this.toString();
    if (arguments.length) {
        var t = typeof arguments[0];
        var key;
        var args = ("string" === t || "number" === t) ?
            Array.prototype.slice.call(arguments)
            : arguments[0];

        for (key in args) {
            str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]);
        }
    }

    return str;
};

Обратите внимание на умный вызов Array.prototype.slice.call(arguments) - это означает, что если вы добавляете аргументы, которые являются строками или числами, а не один объект в стиле JSON, вы получаете поведение C # String.Format почти точно.

"a{0}bcd{1}ef".formatUnicorn("foo", "bar"); // yields "aFOObcdBARef"

Это связано с тем, что slice из Array приведет к тому, что будет в arguments, в Array, независимо от того, было это изначально или нет, и key будет индексом (0, 1, 2 ...) каждого элемента массива, приведенного к строке (например, «0», поэтому "\\{0\\}" для вашего первого шаблона регулярного выражения).

Ухоженная.

26
задан Derek Thurn 15 December 2010 в 21:18
поделиться

1 ответ

libgolang обеспечивает go и каналы включая работу select. Вот использование в качестве примера:

      chan<int> ch = makechan<int>(); // create new channel
      go(worker, ch, 1);              // spawn worker(chan<int>, int)
      ch.send(1)
      j = ch.recv()

      _ = select({
          _default,       // 0
          ch.sends(&i),   // 1
          ch.recvs(&j),   // 2
      });
      if (_ == 0)
          // default case selected
      if (_ == 1)
          // case 1 selected: i sent to ch
      if (_ == 2)
          // case 2 selected: j received from ch

      defer([]() {
          printf("leaving...\n");
      });

      if (<bug condition>)
          panic("bug");

go икра или поток или находящаяся в gevent сопрограмма в зависимости от активированного времени выполнения.

0
ответ дан 28 November 2019 в 17:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: