Каковы недостатки лямбды? - PullRequest
1 голос
/ 19 октября 2010

Я часто предпочитаю делать это:

a, b = lambda do |data|
    [f1(data), f2(data)]
end.call(some_function(some_data))

вместо этого:

data = some_function(some_data))
a, b = f1(data), f2(data)

или это:

a, b = f1(some_function(some_data)), f2(some_function(some_data))

Есть ли какие-либо негативные последствия отиспользовать лямбды почти для каждой вещи?

Ответы [ 2 ]

6 голосов
/ 19 октября 2010

Основным следствием является то, что программисты на Ruby не особенно привыкли делать это таким образом. Любой из ваших вариантов будет легче читаться членами сообщества, другими членами вашей команды, будущими сопровождающими и т. Д.

Второстепенное следствие - создание одноразовых лямбда-функций таким образом будет медленнее, чем вызов статических функций. Создание лямбд не очень-то медленное, но все же медленнее, чем их использование. Если бы вы сделали это много, это начало бы складываться. Чтобы дать некоторый контекст, создание пустой лямбды занимает примерно в 10 раз больше времени, чем создание пустого массива . Так что, если вы делали это неоднократно (например, внутри вызова функции, который используется снова и снова), эта разница может сложиться.

Наконец, есть по крайней мере еще один способ сделать это. Я уверен, что некоторые другие тоже существуют ...

a, b = [:f1, :f2].collect { |fn| send(fn, some_function(some_data)) }

В целом, я думаю, ваша первая альтернатива - самый чистый подход:

data = some_function(some_data)
a, b = f1(data), f2(data)

Совершенно ясно, что вы делаете, и также эффективно.

3 голосов
/ 19 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...