Специализни шаблонца!

Previous Entry Поделиться Next Entry
ES6 is so ES6
Vash
udpn
Загадка 1: что выводит этот код?
Загадка 2: почему он это выводит?

var i = f();
function* f() {
    console.log("A");
    console.log(i.next(2));
    console.log("B");
    console.log(yield 1);
    console.log("C");
}
console.log(i);

  • 1
Не помню, что за звездочка, но я бы ожидал undefined.
Но вышло вот что:
f {[[GeneratorStatus]]: "suspended", [[GeneratorReceiver]]: Window}

Генераторы это новомодные такие.

У меня вот Node.js говорит {}.

А вообще требовать следующего значения от генератора в момент генерации значения как бы слегка странно, и я считаю, что интерпретатор должен упасть с кровавым сообщением об ошибке, а не делать вид, что так и положено, нарушая инвариант языка.

Вот даже ребята говорят:
Calling boost::coroutines::coroutine<>::operator() from inside the same coroutine results in undefined behaviour.

Но в Boost хотя бы простительно, там люди вообще ассемблерными вставками сопроцедуры добавляют. В более здоровых языках undefined behaviour это что-то новенькое. Прямо появилось желание походить-поломать всякие PHP и Python.

Edited at 2016-03-08 00:51 (UTC)

ну там, видимо, проперти как-то хитро определены. Если console.log(i.toString()), то таки видно, что [object Generator]

1. Нет, генератор уже вызвали.
2. Нет, что-то я не вижу в этом документе ничего похожего.

Вызвали функцию-генератор, которая вернула новый объект-генератор, по которому можно итерировать. При этом код внутри функции еще не выполнялся. Если вместо console.log(i) написать i.next(), тогда начнет выполнятся код функции, наткнется на i.next(2) и упадет с ожидаемым TypeError.

UPD. А, вы про такой TypeError. Не обратил внимания.

Edited at 2016-03-08 07:22 (UTC)

текстовое представление генератора, т.к. f() его только создает. А вот конструкция генератора такая, что по-хорошему должна наступить ⊥ (i.next() начинает ожидать до того, как наступил yield), а что выдаст интерпретатор - это дело такое.

  • 1
?

Log in

No account? Create an account