読者です 読者をやめる 読者になる 読者になる

JavaScript 以外での即時関数パターン

.net ruby

以前書いた次の記事を読み返していて思ったんだけど、

C# でも無名関数作れるから即時関数パターンできるよね。

using System;
using System.Diagnostics;

namespace ImmediateFunctionSample
{
    class Program
    {
        static readonly Func<int> GetNextId = new Func<Func<int>>(() =>
        {
            var nextId = 1;
            return () =>
            {
                return nextId++;
            };
        })();

        static readonly string OSName = new Func<string>(() =>
        {
            var version = Environment.OSVersion.Version;
            if (version.Major == 7)
            {
                return "Windows 7";
            }
            else if (version.Major == 6)
            {
                return "Windows Vista";
            }
            else
            {
                return "Windows Vista より前";
            }
        })();

        static void Main(string[] args)
        {
            Debug.Assert(GetNextId() == 1);
            Debug.Assert(GetNextId() == 2);
            Debug.Assert(GetNextId() == 3);
            Debug.Assert(OSName == "Windows Vista");
            Console.ReadLine();
        }
    }
}

今勉強中の Ruby でもできる。

get_next_id = Proc.new {
  next_id = 0
  Proc.new {
    next_id += 1
    next_id
  }
}.call

puts get_next_id.() #=> 1
puts get_next_id.() #=> 2
puts get_next_id.() #=> 3

えっと、それだけ。サンプルで連番の ID を生成するときに使ったことがあるくらいで、他に良い使い道は思いつかないな。