ES6 Generator 및 C# 교체기

8022 단어
ES6 Generator:
완대신의 책에서 묘사한 것을 이용하여
 ,Generator  , 。 ,function ; , yield , (yield “ ”)。

사실 간단하게 말하면 각종 상태를 통해 함수는 여러 개의 값을 되돌릴 수 있다. 글을 보고 나니 다음과 같은 기능이 비교적 많이 사용될 수 있다고 생각한다
function* objectEntries(obj) {
  let propKeys = Reflect.ownKeys(obj);

  for (let propKey of propKeys) {
    yield [propKey, obj[propKey]];
  }
}

let jane = { first: 'Jane', last: 'Doe' };

for (let [key, value] of objectEntries(jane)) {
  console.log(`${key}: ${value}`);
}
// first: Jane
// last: Doe

위 코드에서 대상jane의 원생은 Iterator 인터페이스를 갖추지 않아서 for...of 반복할 수 없습니다.이때, 우리는Generator 함수objectEntries를 통해 그것을 캐리어 인터페이스를 추가하면 for...of로 캐리어를 캐리어할 수 있다.캐리어 인터페이스를 추가하는 또 다른 방법은 Generator 함수를 대상의 Symbol.iterator 속성에 추가하는 것이다.
function* objectEntries() {
  let propKeys = Object.keys(this);

  for (let propKey of propKeys) {
    yield [propKey, this[propKey]];
  }
}

let jane = { first: 'Jane', last: 'Doe' };

jane[Symbol.iterator] = objectEntries;

for (let [key, value] of jane) {
  console.log(`${key}: ${value}`);
}
// first: Jane
// last: Doe

우아한Generator 비동기 응용 모듈:thunkify와co모듈;
 
C# yield
ES6의 Generator와 동일합니다.마이크로소프트 공식 문서를 참고할 수 있다.
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/yield
주로 예를 보십시오. 예는 뚜렷하고 교체기를 사용하여 매번 한 개의 값을 되돌릴 수 있지만 최종적으로 여러 개의 값을 되돌릴 수 있습니다.
교체기 방법:
public class PowersOf2
{
    static void Main()
    {
        // Display powers of 2 up to the exponent of 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }

    public static System.Collections.Generic.IEnumerable<int> Power(int number, int exponent)
    {
        int result = 1;

        for (int i = 0; i < exponent; i++)
        {
            result = result * number;
            yield return result;
        }
    }

    // Output: 2 4 8 16 32 64 128 256
}

 
교체기의 get 접근기
public static class GalaxyClass
{
    public static void ShowGalaxies()
    {
        var theGalaxies = new Galaxies();
        foreach (Galaxy theGalaxy in theGalaxies.NextGalaxy)
        {
            Debug.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears.ToString());
        }
    }

    public class Galaxies
    {

        public System.Collections.Generic.IEnumerable NextGalaxy
        {
            get
            {
                yield return new Galaxy { Name = "Tadpole", MegaLightYears = 400 };
                yield return new Galaxy { Name = "Pinwheel", MegaLightYears = 25 };
                yield return new Galaxy { Name = "Milky Way", MegaLightYears = 0 };
                yield return new Galaxy { Name = "Andromeda", MegaLightYears = 3 };
            }
        }
    }

    public class Galaxy
    {
        public String Name { get; set; }
        public int MegaLightYears { get; set; }
    }
}

좋은 웹페이지 즐겨찾기