Я только что нашел эту функцию в проекте, над которым я работаю:
-- Just returns the text unchanged.
-- Note: <text> may be nil, function must return nil in that case!
function Widget:wtr(text)
return text
end
Жаль, кодер больше не работает в компании. Зачем делать функцию, которая ничего не делает, но возвращает параметр, с которым она вызывается?
Есть ли какая-либо польза от такой функции, не указанная в этом примере, но в целом в любом случае?
Из-за
function aFunction(parameter)
return parameter
end
Заканчивается в
aFunction(parameter) == parameter
Зачем мне писать что-то вроде
aFunction(parameter) == whatIWantToCheck
вместо того
parameter == whatIWantToCheck
?
this
.int getParam(int param) { //DO NOTHING return param; }
С точки зрения цепочки методов, это совершенно избыточный и ненужный вызов, поскольку вы можете оставить функцию OP вне цепочки методов, и это не будет иметь никакого значения.new Foo()->method();
недопустимый синтаксис, и подобные конструкцииfunction with($what) { return $what; }; with(new Foo())->method();
использовались в качестве обходного пути.Ответы:
Ваш вопрос похож на вопрос, что хорошего в нулевом числе, если всякий раз, когда вы добавляете его к чему-то, вы получаете то же значение обратно. Тождественная функция подобна нулю для функций. Это само по себе бесполезно, но иногда полезно как часть выражения, использующего функции высшего порядка, где вы можете взять функцию в качестве параметра или вернуть ее в результате. Вот почему большинство функциональных языков программирования имеют
id
илиidentity
в своей стандартной библиотеке.Другими словами, это удобная функция по умолчанию. Точно так же, как вы можете захотеть установить
offset = 0
в качестве целочисленного значения по умолчанию, даже если это делает смещение бездействующим, может пригодиться возможность установкиfilterFunction = identity
в качестве функции по умолчанию, даже если это заставляет фильтр ничего не делать.источник
filter
более высокого порядка. Функция первого порядкаfilter
имеет тип[a] -> [a]
:.OrderBy(x => x)
Конечно. Представьте себе внешний API, который позволяет вам извлекать вещи из того места, которое вам абсолютно необходимо, но вы должны указать критерии фильтра и выходные форматеры для каждого запроса, даже если вы хотите получить все результаты и получить их в точности как сохраненные.
Тогда вам придется изобрести тривиальную функцию «принять все» и тривиальную функцию «вернуть без изменений», чтобы получить данные.
wtr
именно такой тривиальный псевдо-форматер. Если вы часто используете этот API, может быть очень полезно иметь эту псевдо-вспомогательную функцию, а не создавать анонимную функцию всякий раз, когда вы что-то запрашиваете. (Вы можете подумать об этом,identity
а не оwtr
том, чтобы сразу было ясно, что ничего не происходит.)источник
null
в качестве аргумента, вы используете пустую функцию фильтра, которая фильтрует «ничего», чтобы программа перестала жаловаться.WHERE
пункт? Это вопрос синтаксического сахара. По сути, отсутствиеWHERE
предложения точно такое же, как если бы у вас былоWHERE
предложение, которое просто идет вперед и позволяет все. Тот факт, что разработчики SQL позволяют вам не указыватьWHERE
предложение, вместо того, чтобы заставлять его опускать его, даже когда он принимает все, является более или менее синтаксическим сахаром, и они просто предоставили вам эту опцию для простого удобства. ..Разве это не просто полиморфизм?
Из моего опыта работы с Qt
tr()
иwtr()
методами предполагается использовать (там, в Qt ) локализациюWidget
русского текста.Так, возвращая неизменный текст этого метод просто говорит:
Widget does no localization (translation of the text) by default. Override this function to enable your own logic
.источник
Очень распространенный случай для этого - «позже добавленная функциональность». Поэтому программист подумал, что в этой функции могут быть некоторые изменения позже. Поскольку вы обращаетесь к нему как к функции, а не как к самому параметру, вы можете легко изменить это глобально. Допустим, у вас есть индекс с:
и так как ваш индекс начинается с 0, все в порядке. Позже вы изменяете компонент где-то еще, этот компонент требует, чтобы вы перевели свой индекс, чтобы начать с 1. Вы должны были бы добавить сотни индексов + 1 везде в вашем коде. Но с помощью такого метода просто скажите:
и ты в порядке. Подобные функции могут быстро привести к чрезмерному проектированию, но в некоторых случаях они имеют большой смысл!
источник
Подобные функции-заглушки распространены в ситуациях наследования типов. Базовый класс может не делать ничего полезного, но производные классы могут делать разные вещи с входными данными. Объявление функции-заглушки в базовом классе позволяет всем производным классам иметь функцию с таким именем, а отдельные производные классы заменяют ее чем-то более сложным и полезным.
источник
Один дополнительный сценарий похож на использование в python и C # свойств, но в языках, которые не имеют этой функции.
В общем, вы можете объявить что-то просто как член класса; скажем, «имя» в виде строки. Это означает, что вы получаете к нему доступ следующим образом:
Позже вы решаете, что имя действительно должно зависеть от того, что находится в объекте. Так что это действительно должно быть функцией. К сожалению! Даже без аргументов это означает, что весь код, который обращается к нему, теперь должен быть изменен на
Но если у вас много экземпляров этого вызова, вероятность того, что с этим ничего не случится, довольно мала - где-то это изменение не будет сделано, программа вылетит, когда вы доберетесь до этой точки и т. Д.
Свойства в C # / Python позволяют вам заменить функцию на то, что раньше было атрибутом, и в то же время разрешить доступ к нему как к атрибуту, то есть без изменений. Вам даже не нужно планировать заранее.
Если в вашем языке этого нет, вы должны планировать заранее, но вы все равно можете поддержать его, как это делали люди, сделав его с самого начала функцией, которая ничего не делает. В начале, это не будет делать ничего интересного, и похоже, что это должно быть удалено, и многие функции этого типа никогда не меняются. Но позже, если вы поймете, что на самом деле всякий раз, когда вы звоните,
Widget.wtr
вам нужно убрать некоторые специальные символы, это не страшно - это уже функция, вы просто добавляете это и все готово.TL; DR Это может быть просто мудрый программист, заранее планирующий будущие изменения.
источник
print data
. Затем позже вы понимаете, что все строки должны быть в верхнем регистре - вам нужно будет найти каждый отпечаток в вашей программе и перейти наprint data.upper()
. Но если ты имеешьdef cdata(data): return data
и вездеprint cdata(data)
говоришь, то ты просто меняешься,def cdata(data): return data.upper()
и это единственное изменение.Это не бесполезно, на самом деле это может быть чрезвычайно полезно, потому что делает ваш код более единообразным и гибким.
Скажем, например, что у вас есть список людей и выпадающий список, который пользователь может выбрать, хотим ли мы видеть «все» или только те, которые являются «мужчинами» или «женщинами».
Вы можете обрабатывать «все» как особый случай, и в этом случае вам понадобится дополнительный if и для явной проверки этого случая, или у вас может быть функция фильтра, которая просто возвращает свой параметр (например, позволяет всему проходить), назначен для использования в случае «все».
источник
Filter
класс или интерфейс сMaleFilter
иFemaleFilter
подклассами, и ваш код требует некоторого фильтра, то как вы обрабатываете фильтр, который ничего не делает (возвращает свой параметр без изменений)All
. Функция никогда ничего не делает, но может быть заменена той, которая делает.