このC#コードのように動作するコードをRubyで記述したいと思います。
候補トポロジセットとワールドセットを受け取り、候補トポロジがワールドに関するトポロジであるかどうかをテストします。
LINQ機能を使用するC#では、次のようになります。
public static bool IsTopology<T>(IEnumerable<IEnumerable<T>> candidate, IEnumerable<T> world)
{
IEqualityComparer<IEnumerable<T>> setComparer =
new SetComparer<T>();
if (!candidate.Contains(Enumerable.Empty<T>(), setComparer) ||
!candidate.Contains(world, setComparer))
{
return false;
}
var pairs =
from x in candidate
from y in candidate
select new {x,y};
return pairs.All(pair => candidate.Contains(pair.x.Union(pair.y), setComparer) &&
candidate.Contains(pair.x.Intersect(pair.y), setComparer));
}
public class SetComparer<T> : IEqualityComparer<IEnumerable<T>>
{
public bool Equals (IEnumerable<T> x, IEnumerable<T> y)
{
return new HashSet<T>(x).SetEquals(y);
}
public int GetHashCode (IEnumerable<T> obj)
{
return 0;
}
}
私が探している機能は次のとおりです。
等式比較器をメソッドにプラグインする機能
ネストされたマップ(および匿名タイプ)を使用する機能
配列をセットとして比較する機能(それほど重要ではありませんが、C#では少し欠けています...)
rubyには機能があると思いますが、同等のコードがどのようになるかを知りたいと思っています。