Функция Rx Let - PullRequest
       6

Функция Rx Let

5 голосов
/ 25 августа 2011

Я изучал библиотеку Rx и пытался воспроизвести пример из следующего видео ...

http://channel9.msdn.com/blogs/j.van.gogh/writing-your-first-rx-application

все это работает (с некоторыми изменениями, которые былиизменено / устарело) до тех пор, пока он не использовал ...

.Let(mm => ...)

Это выдает ошибку компилятора, говорящую, что нет определения для let, поэтому я предполагаю, что Let был изменен на что-то другое или полностью удален,но я не могу найти какие-либо решения от поиска в Google.

Так кто-нибудь знает, что использовать в этом случае?

Ответы [ 5 ]

6 голосов
/ 07 февраля 2012

В соответствии с предложением Джима Вули.

Я думаю, что код, который вы просматриваете,

var q = from start in mouseDown
  from delta in mouseMove.StartWith(start).Until(mouseUp)
    .Let(mm=> mm.Zip(mm.Skip(1), (prev, curr) =>
              new { X = curr.X - prev.X, Y = curr.Y - prev.Y}))
  select delta;

Помните, что он был написан в 2009 году, и с тех пор Rx продвинулся вперед.Я думаю, что это то, что вы хотите.Я думаю, что Let - это функция, которую вы хотите избежать (даже если она доступна для вас) в Rx, поскольку она может вызывать побочные эффекты.Вместо этого используйте преобразование с помощью Select.В случае ниже, let просто не нужен.

//Gets the delta of positions.
var mouseMovements = mouseMove.Zip(mouseMove.Skip(1), (prev, curr) =>
              new { X = curr.X - prev.X, Y = curr.Y - prev.Y}));
//Only streams when mouse is down
var dragging = from md in mouseDown
               from mm in mouseMovement.TakeUntil(mouseUp)
               select mm;
1 голос
/ 26 августа 2011

Let позволяет вам дать выражению собственное имя, чтобы вы могли использовать его позже, не используя локальную переменную. Вы всегда можете разбить выражение Rx на части и назначить их локальным переменным. Можете ли вы опубликовать исходный запрос, и я покажу вам, как его разрешить?

1 голос
/ 25 августа 2011

Попробуйте использовать другой. Выберите и спроектируйте тип, который включает в себя как новую переменную, так и входящее наблюдаемое значение.

1 голос
/ 25 августа 2011

Возможно, вы пытаетесь использовать EnumerableEx.Let, который был удален из текущей экспериментальной версии интерактивных расширений. Они вернут его обратно.

Тем временем вы можете легко определить это так:

public static class EnumerableExx
{
    public static U Let<T,U>(this T source, Func<T,U> f)
    {
        return f(source);
    }
}

Обратите внимание, что эта версия работает с любым типом, а не только с IEnumerable.

Вместо этого вы также можете использовать Memoize (...), что может быть лучше, поскольку он кэширует коллекцию с левой стороны.

0 голосов
/ 25 августа 2011

Пусть все еще существует, у вас это не работает?

var observable = new Subject<int>();
observable.Let(mm => mm);

Возможно, вы забыли импорт пространства имен?(System.Reactive.Linq)?

...