tonari note

オンラインゲームエンジニアの雑記

SwitchPattern

以前、ActionPatternなるものを作ったんですが、顧客が本当に欲しいものを吟味した結果、下のようなものができました。

SwitchPattern.cs · GitHub


まずは単純なswitch。

using static System.Console;
using static Tonari.ActionPattern.SwitchPattern;

//==

Switch(count)
    .Case(0, _ => WriteLine("Zero"))
    .Case(1, _ => WriteLine("One"))
    .Case(2, _ => WriteLine("Two"))
    .Default(_ => WriteLine("数えきれないよ"));

FizzBuzz

using static System.Console;
using static Tonari.ActionPattern.SwitchPattern;

//==

for(var i = 0; i < 100; ++i)
{
    Switch(i)
        .Case(_ => i % 15 == 0, _ => WriteLine("FizzBuzz"))
        .Case(_ => i % 5 == 0, _ => WriteLine("Buzz"))
        .Case(_ => i % 3 == 0, _ => WriteLine("Fizz"))
        .Default(_ => WriteLine(i.ToString()));
}

型マッチ。

using static Tonari.ActionPattern.SwitchPattern;

//==

public string WhatIs<T>(T value)
{
    var result = string.Empty;

    Switch(value)
        .Case<int>(_ => result = "int型")
        .Case<float>(_ => result = "float型")
        .Case<string>(_ => result = "string型")
        .Default(_ => result = "しらなーい");

    return result;
}

型マッチ+条件

using static Tonari.ActionPattern.SwitchPattern;

//==

public string WhatIs<T>(T value)
{
    var result = string.Empty;

    Switch(value)
        .Case<int>(x => x % 2 != 0, _ => result = "int型の奇数")
        .Case<int>(_ => result = "int型の偶数")
        .Case<float>(_ => result = "float型")
        .Case<string>(_ => result = "string型")
        .Default(_ => result = "しらなーい");

    return result;
}

複数Enumとかまとめて

using static Tonari.ActionPattern.SwitchPattern;

//==

enum Fruit { Apple, Orange }
enum Meet { Pork, Beef }

//==

public int GetPrice<T>(T value)
{
    var result = 0;

    Switch(value)
        .Case<Fruit>(Fruit.Apple, _ => result = 100)
        .Case<Fruit>(Fruit.Orange, _ => result = 50)
        .Case<Meet>(Meet.Pork, _ => result = 100)
        .Case<Meet>(Meet.Beef, _ => result = 200);

    return result;
}

さすがにUnity/Mono iOSではJIT落ちするんですが、Unity/IL2CPPだと実機で動いたんで多分動く。
きっと。


【追記】

using static Tonari.ActionPattern.SwitchPattern;

//==

public string WhatIs<T>(T value)
{
    var result = string.Empty;

    Switch(value)
        .Case<int>(x => x % 2 != 0, _ => result = "int型の奇数")
        .Case<int>(_ => result = "int型の偶数")
        .Case<float>(_ => result = "float型")
        .Case<string>(_ => result = "string型")
        .Default(_ => result = "しらなーい");

    return result;
}

using static Tonari.ActionPattern.SwitchPattern;

//==

public string WhatIs<T>(T value)
{
    return SelectSwitch<T, string>(value)
        .Case<int>(x => x % 2 != 0, _ => "int型の奇数")
        .Case<int>(_ => "int型の偶数")
        .Case<float>(_ => "float型")
        .Case<string>(_ => "string型")
        .Default(_ => "しらなーい");
}

と書けるようにしました