以前書いた次の記事を読み返していて思ったんだけど、
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 を生成するときに使ったことがあるくらいで、他に良い使い道は思いつかないな。