2016-11-18 4 views
1
placeholder = f() 
    if placeholder then return placeholder end 

это чувствует себя неэлегантно, делая такую ​​простую задачу в двух строках с таким количеством слов, что кажется странным. Есть ли менее подробный/«лучший» способ написать это?проверка возвращаемого значения функции перед использованием результата

пример, где это полезно является:

for f in pairs(listOfFunctions) do 
     placeholder = f() 
     if placeholder then return f() end 
    end 
+0

Нет сокращений. Такова природа Луа. – lhf

+3

Можете ли вы привести более крупный пример с небольшим контекстом? Если это ваше тело всей функции, его можно легко свести к 'return f()' или 'return f() или nil' (если вы хотите избежать возврата false), учитывая, что ветка else еще ничто. 'return f() или (function() return .... end)()' можно использовать для создания водопадов, но это немного уродливые вещи. Как правило, нет, нет никакого способа вернуть результат, только если результат. – Oka

+0

Вам нужен эффективный код или красивый код? – warspyking

ответ

0

фона:

  • функция может иметь любое количество операторов возврата, которые возвращают любое число значений, и может варьироваться от вызова к вызову ,
  • or - оператор селектора: он возвращает первый операнд без «ложных». (Это второе выражение операнда не оценивается, если это необходимо.)
  • выражение, которое дает список, сохраняет весь список в контексте списка (например, последнее выражение в списке, такой оператор возврата), но только первый значение в контексте без списка (например, внутри круглых скобок).

Непонятно, какие возвратные списки вы хотите вернуть и при каких условиях. То, что вы показываете, похоже, если f() возвращает список с первым значением ни nil, ни false, верните это одно значение; иначе возвращаем пустой список.

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

Итак, вот несколько альтернатив.

Возврат все значения f() 'ы результат списку

return f() 

Или возвращать только первое значение в е()' s результат-список, nil если ни один

return (f()) 

Или вернуть первое значение в е() 's результат-список, если он не является ни nil, ни false, иначе вернуть nil

return f() or nil 

Или вернуть первое значение в е() 's результат-список, если он не является ни nil, ни false, иначе вернуть false

return f() or false 

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

+0

вы пропустите понять, я хочу: return 'f()' или продолжить, а не возвращать 'f()' или 'false' /' nil' – Julian

+0

Да, поэтому я предложил вам перестроить код, который у вас есть Не показано. –

+0

Код, который вы сейчас показываете, довольно сильно обернут в необходимый поток управления, поэтому я не вижу прямого улучшения. Значения и функции в стиле Монады могли бы привести куда-то, но это было бы большим изменением и, вероятно, бессмысленным. –

Смежные вопросы