Я хотел бы написать код на Ruby, который ведет себя как этот код C #.
Он получает набор топологии-кандидата и мировой набор и проверяет, является ли топология-кандидат топологией по отношению к миру.
В C # с использованием функций LINQ это выглядит так:
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 есть функции, и мне очень интересно посмотреть, как будет выглядеть эквивалентный код.