function foo_in_ecmascript(x) {
let computed = {
bar : magic(x),
baz : mystery(x),
quux : fantasy(x)
};
// ... do stuff with computed.baz, computed.quux and/or
// computed.baz, e.g.
console.log(`computed.quux is ${computed.quux}`);
}
< /code>
Но мы не можем сделать это в C ++: < /p>
void foo(int x) {
struct {
auto bar = magic(x);
auto baz = mystery(x);
auto quux = fantasy(x);
} computed;
// ... do stuff with computed.baz, computed.quux and/or computed.baz
}
< /code>
... потому что мы не можем использовать инициализаторы поля неконтекса. Мы можем написать: < /p>
void foo2(int x) {
struct {
Bar bar;
Baz baz;
Quux quux;
} computed = {
magic(x),
mystery(x),
fantasy(x)
};
// ... do stuff with computed.baz, computed.quux and/or computed.baz
}
< /code>
Но это длиннее, требует изложения типа возврата каждой из функций, требует немного большей осторожности для поддержания соответствия строк и немного менее читаемо, поскольку тип и имя переменной отделены от инициализатора (и мы можем иметь еще больше полей). < /p>
с C ++, мы можем использовать проектные инициализации). class = "lang-c ++ prettyprint-override">void foo3(int x) {
struct {
Bar bar;
Baz baz;
Quux quux;
} computed = {
.bar { magic(x) },
.baz { mystery(x) },
.quux { fantasy(x) }
};
// ... do stuff with computed.baz, computed.quux and/or computed.baz
}
< /code>
Что улучшает читабельность, но не длины в строках, и дублировать идентификаторы поля. < /p>
Но - мы можем сделать лучше, чем это? Приходите ближе к «интуитивно понятной», но недостижимой форме анонимного типа-декорация-инициализация? Это не может быть 3-ople, ни три отдельные переменные. Решение именно этой ситуации уже полезна, но в более общем плане функции могут принимать локальные переменные в foo ()
, другой параметр для foo () , глобальные исчисления и т. д.
На некоторых языках мы можем объявить и инициализировать анонимную структуру - или эквивалент ее - плавно. Пример из Ecmascript: < /p> [code]function foo_in_ecmascript(x) { let computed = { bar : magic(x), baz : mystery(x), quux : fantasy(x) }; // ... do stuff with computed.baz, computed.quux and/or // computed.baz, e.g. console.log(`computed.quux is ${computed.quux}`); } < /code> Но мы не можем сделать это в C ++: < /p> void foo(int x) { struct { auto bar = magic(x); auto baz = mystery(x); auto quux = fantasy(x); } computed;
// ... do stuff with computed.baz, computed.quux and/or computed.baz } < /code> ... потому что мы не можем использовать инициализаторы поля неконтекса. Мы можем написать: < /p> void foo2(int x) { struct { Bar bar; Baz baz; Quux quux; } computed = { magic(x), mystery(x), fantasy(x) }; // ... do stuff with computed.baz, computed.quux and/or computed.baz } < /code> Но это длиннее, требует изложения типа возврата каждой из функций, требует немного большей осторожности для поддержания соответствия строк и немного менее читаемо, поскольку тип и имя переменной отделены от инициализатора (и мы можем иметь еще больше полей). < /p> с C ++, мы можем использовать проектные инициализации). class = "lang-c ++ prettyprint-override">void foo3(int x) { struct { Bar bar; Baz baz; Quux quux; } computed = { .bar { magic(x) }, .baz { mystery(x) }, .quux { fantasy(x) } }; // ... do stuff with computed.baz, computed.quux and/or computed.baz } < /code> Что улучшает читабельность, но не длины в строках, и дублировать идентификаторы поля. < /p> Но - мы можем сделать лучше, чем это? Приходите ближе к «интуитивно понятной», но недостижимой форме анонимного типа-декорация-инициализация? Это не может быть 3-ople, ни три отдельные переменные. Решение именно этой ситуации уже полезна, но в более общем плане функции могут принимать локальные переменные в foo () [/code], другой параметр для foo () , глобальные исчисления и т. д.