Перечисления против возврата

Я читал над перечислимым модулем в Ruby, и он содержит несколько методов, которые следуют шаблону

enum.foo(n) {|obj| block } → nil
enum.foo(n) → an_enumerator

Иными словами, они, похоже, возвращают итератор при прикованном цепях и ничего другого. Какова причина этого подхода вместо того, чтобы просто возвращать последовательность? (Я прошу об общих рассуждениях для этого подхода, не обязательно просто его использование в Ruby)

1 голос | спросил Inaimathi 4 FebruaryEurope/MoscowbFri, 04 Feb 2011 19:04:53 +0300000000pmFri, 04 Feb 2011 19:04:53 +030011 2011, 19:04:53

2 ответа


3

Я думаю, что это было введено для лучшей поддержки цепочки операций. Это может быть слишком дорого для создания ненужных промежуточных объектов.

См. например https://github.com/rdp/ruby_tutorials_core/wiki/enumerator

ответил LennyProgrammers 4 FebruaryEurope/MoscowbFri, 04 Feb 2011 19:11:56 +0300000000pmFri, 04 Feb 2011 19:11:56 +030011 2011, 19:11:56
0

Итак, я не уверен в различиях между двумя подходами в Ruby, но в C # у нас есть ключевое слово yield (которое может использоваться только при возврате IEnumerable или IEnumerable (общий Enumerable). То, что делает ключевое слово yield, закрытие по текущей среде, создающее счетчик, который использует это закрытие. Проще демонстрировать в коде, чем говорить об этом. Вот генератор Fibonnaci с выходом:

public IEnumerable<long> Fibonnaci()
{
  long current, previous;
  if(current==0)
    yield return current++;
  (for byte i=2;i<128;i++) //Fibonacci numbers grow big quickly.
  {
    long tmp=current+previous;
    previous=current;
    current=tmp;
    yield return tmp;
  }
}

Обратите внимание, что мне не нужно использовать рекурсию, я просто оцениваю текущее значение и возвращаю. Теперь, если я хочу получить x-й номер Fibonnaci, я просто создаю такую ​​функцию:

public long GetFibonacciNumber(byte count)
{
   byte currentCount;
   foreach(long value in Fibonacci())
   {
     if(++currentCount<count)
       break;
     return value;
   }
}

Мощный материал.

ответил Michael Brown 4 FebruaryEurope/MoscowbFri, 04 Feb 2011 19:43:26 +0300000000pmFri, 04 Feb 2011 19:43:26 +030011 2011, 19:43:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132