Ruby 从集合中选择具有最小Schwartzian变换的对象

Ruby 从集合中选择具有最小Schwartzian变换的对象,ruby,artificial-intelligence,path-finding,Ruby,Artificial Intelligence,Path Finding,我正在实现一个*for,并且想知道一种巧妙的方法来选择基于schartzian变换的集合的最小值 基本上,我有一个合适的广场集合,我想搬到成本最低的广场 基本上,我会从我的邻居那里选择广场,他们在一个环路中成本最低 我能想到的唯一方法就是用 next_spot=spot.neights.sort_by | a,b{a.cost(dest)b.cost(dest)}。first 但我真的希望有更高的性能,因为我不想对集合进行排序,我只想要具有最小转换值的集合 注意,我可以写一些更详细和“C风格”的

我正在实现一个*for,并且想知道一种巧妙的方法来选择基于schartzian变换的集合的最小值

基本上,我有一个合适的广场集合,我想搬到成本最低的广场

基本上,我会从我的邻居那里选择广场,他们在一个环路中成本最低

我能想到的唯一方法就是用

next_spot=spot.neights.sort_by | a,b{a.cost(dest)b.cost(dest)}。first

但我真的希望有更高的性能,因为我不想对集合进行排序,我只想要具有最小转换值的集合

注意,我可以写一些更详细和“C风格”的循环,并保持以前的最低限度,但我希望有一些清晰紧凑的东西。

为什么不使用

如果一个可枚举ish方法的“_by”版本不存在,你可以用老式的方法,用这种伪Ruby模式手工进行Schwartzian变换:

a.map { |x| [ expensive(x), x ] }.       # Do the expensive part once and cache it
  op  { |x| something_with x.first... }. # Do what you really came to do
  map { |x| x.last }                     # Unwrap the caching

这正是我想要的!我从未见过这种方法。谢谢我的错误是,我经常把这两个词混在一起,并根据需要删除或添加
a.map { |x| [ expensive(x), x ] }.       # Do the expensive part once and cache it
  op  { |x| something_with x.first... }. # Do what you really came to do
  map { |x| x.last }                     # Unwrap the caching