Проблема с преобразованием перечислений в C ++\CLI

Интересно, что люди в этих ответах затронули как Object.keys(), так и for...of, но никогда не комбинировали их:

var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
    console.log(key + ':' + map[key]);

Вы не можете просто for...of Object, потому что это не итератор и for...index или .forEach() в Object.keys() являются уродливыми / неэффективными. Я рад, что большинство людей воздерживаются от for...in (с проверкой или без проверки .hasOwnProperty()), так как это тоже немного грязно, поэтому, кроме моего ответа выше, я здесь, чтобы сказать ...


Вы можете сделать обычные ассоциации объектов итерации! Поведение так же, как Map s с прямым использованием fancy for...of DEMO , работающего в Chrome и FF (я предполагаю только ES6)

var ordinaryObject = {well:'hello', there:'!'};
for (let pair of ordinaryObject)
    //key:value
    console.log(pair[0] + ':' + pair[1]);

//or
for (let [key, value] of ordinaryObject)
    console.log(key + ':' + value);

Пока вы включаете моя подкладка ниже:

//makes all objects iterable just like Maps!!! YAY
//iterates over Object.keys() (which already ignores prototype chain for us)
Object.prototype[Symbol.iterator] = function() {
    var keys = Object.keys(this)[Symbol.iterator]();
    var obj = this;
    var output;
    return {next:function() {
        if (!(output = keys.next()).done)
            output.value = [output.value, obj[output.value]];
        return output;
    }};
};

Без создания реального объекта карты, который не имеет приятного синтаксического сахара.

var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
    console.log(pair[0] + ':' + pair[1]);

На самом деле, с помощью этой прокладки, если вы все еще хотели воспользоваться другими функциональными возможностями карты (без их обкатки), но все же хотели использовать аккуратную нотацию объекта, поскольку теперь объекты теперь можно итерабельны, теперь вы можете просто сделать карту из нее!

//shown in demo
var realMap = new Map({well:'hello', there:'!'});

Для тех, кто не любит подмешивать или вообще не вмешивается в prototype, не стесняйтесь делать эту функцию на окне, называя ее чем-то вроде getObjIterator(), тогда:

//no prototype manipulation
function getObjIterator(obj) {
    //create a dummy object instead of adding functionality to all objects
    var iterator = new Object();

    //give it what the shim does but as its own local property
    iterator[Symbol.iterator] = function() {
        var keys = Object.keys(obj)[Symbol.iterator]();
        var output;

        return {next:function() {
            if (!(output = keys.next()).done)
                output.value = [output.value, obj[output.value]];
            return output;
        }};
    };

    return iterator;
}

Теперь вы можете просто называть его обычной функцией, ничего больше не влияет

var realMap = new Map(getObjIterator({well:'hello', there:'!'}))

или

for (let pair of getObjIterator(ordinaryObject))

Нет причин, по которым это не было бы

Добро пожаловать в будущее.

5
задан Deduplicator 9 March 2015 в 12:48
поделиться

2 ответа

В C++ / CLI ^ похож на analagous * в стандартном C++. Поскольку перечисления являются типами значения, ^ не должен быть включен иначе, Вы будете рассматривать их как Систему. Перечисление.

Удалите ^, и Вы будете видеть корректное перечисление на стороне C#.

property System::ServiceProcess::ServiceControllerStatus Status  
{  
    System::ServiceProcess::ServiceControllerStatus get()  
    {  
        return (System::ServiceProcess::ServiceControllerStatus)_status->dwCurrentState;   
    }  
}
5
ответ дан 14 December 2019 в 04:51
поделиться

Я думаю, что перечисления не используют ^ - пытаются удалить его из объявления свойства и добираются ().

3
ответ дан 14 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

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