Acabei de encontrar essa função no projeto em que estou trabalhando:
-- Just returns the text unchanged.
-- Note: <text> may be nil, function must return nil in that case!
function Widget:wtr(text)
return text
end
Muito triste, o codificador não funciona mais na empresa. Por que alguém criaria uma função que não faz nada, mas retorna o parâmetro com o qual é chamado?
Existe alguma utilidade para essa função, não especificada neste exemplo, mas global em qualquer caso?
Devido a
function aFunction(parameter)
return parameter
end
Termina em
aFunction(parameter) == parameter
Por que eu escreveria algo como
aFunction(parameter) == whatIWantToCheck
ao invés de
parameter == whatIWantToCheck
?
functions
parameters
lua
method-chaining
Sempie
fonte
fonte
this
.int getParam(int param) { //DO NOTHING return param; }
De uma perspectiva de encadeamento de métodos, é uma chamada completamente redundante e desnecessária, pois você pode deixar a função do OP fora de uma cadeia de métodos e isso não faria nenhuma diferença.new Foo()->method();
não havia sintaxe válida e construções comofunction with($what) { return $what; }; with(new Foo())->method();
foram usadas como solução alternativa.Respostas:
Sua pergunta é como perguntar o que há de bom no número zero se, sempre que você o adiciona a algo, você obtém o mesmo valor de volta. Uma função de identidade é como o zero para funções. Meio inútil por si só, mas ocasionalmente útil como parte de uma expressão usando funções de ordem superior, onde você pode pegar uma função como parâmetro ou retorná-la como resultado. É por isso que a maioria das linguagens de programação funcionais possui uma
id
ouidentity
em sua biblioteca padrão.Em outras palavras, ele cria uma função padrão útil. Assim como você pode definir
offset = 0
como um número inteiro padrão, mesmo que isso faça com que um deslocamento não faça nada, pode ser útil definirfilterFunction = identity
uma função padrão, mesmo que isso faça com que o filtro não faça nada.fonte
filter
função de ordem superior. Umafilter
função de primeira ordem tem o tipo[a] -> [a]
,.OrderBy(x => x)
Certo. Imagine uma API externa que permita recuperar coisas de algum lugar absolutamente necessário, mas você deve especificar critérios de filtro e formatadores de saída para cada consulta, mesmo que deseje todos os resultados e os obtenha exatamente como armazenados.
Então você teria que inventar uma função trivial de "aceitar tudo" e uma função trivial de "retorno inalterado" para obter os dados.
wtr
é precisamente um pseudo-formatador tão trivial. Se você usa muito essa API, pode ser muito útil ter essa função pseudo-auxiliar por aí, em vez de criar uma função anônima sempre que você consultar algo. (Você pode chamá-loidentity
e nãowtr
para que fique imediatamente claro que não faz nada.)fonte
null
como argumento, use uma função de filtro vazia que filtra com 'nada' para fazer o programa parar de reclamar.WHERE
cláusula? Isso é uma questão de açúcar sintático. Essencialmente, a ausência de umaWHERE
cláusula é exatamente a mesma que se você tivesse umaWHERE
cláusula que apenas segue em frente e permite tudo. O fato de os designers do SQL não permitirem que você especifique umaWHERE
cláusula, em vez de forçá-la a colocar uma, mesmo quando ela aceita tudo, é mais ou menos açúcar sintático, e eles apenas forneceram essa opção por conveniência simples. ...Isso não é apenas um polimorfismo?
Da minha experiência com o Qt
tr()
e oswtr()
métodos devem ser usados (lá, no Qt ) na localização doWidget
texto.Então, retornando texto inalterado este método apenas diz:
Widget does no localization (translation of the text) by default. Override this function to enable your own logic
.fonte
Um caso muito comum para isso é "funcionalidade adicionada posteriormente". Portanto, o programador pensou que poderia haver alguma alteração nessa função posteriormente. Como você o acessa como uma função e não como o próprio parâmetro, você pode facilmente mudar isso globalmente. Digamos que você tenha um índice com:
e como seu índice começa em 0, tudo bem. Mais tarde, você altera um componente em outro lugar, esse componente precisa que você traduza seu índice para começar em 1. Você teria que adicionar centenas de índice + 1 em qualquer lugar do seu código. Mas com um método como este, basta dizer:
e você está bem. Funções como essa podem levar rapidamente ao excesso de engenharia, mas em alguns momentos elas fazem muito sentido!
fonte
Funções de stub como essa são comuns em situações de herança de tipo. A classe base pode não fazer nada útil, mas as classes derivadas podem fazer várias coisas com as entradas. Declarar a função stub na classe base permite que todas as classes derivadas tenham uma função com esse nome, e as classes derivadas individuais a substituam por algo mais elaborado e útil.
fonte
Um cenário adicional é semelhante ao uso em python e C # de propriedades, mas em idiomas que não possuem o recurso.
Em geral, você pode declarar algo como apenas um membro da classe; digamos, 'nome' como uma string. Isso significa que você acessa assim:
Mais tarde, você decide que o nome realmente precisa depender do que está no objeto. Portanto, deve ser realmente uma função. Opa! Mesmo sem argumentos, isso significa que todo o código que o acessa agora deve ser alterado para
Mas se você tiver muitas instâncias dessa ligação, as chances de nada dar errado são muito baixas - em algum lugar em que essa alteração não será feita, o programa falhará quando você chegar a esse ponto etc.
As propriedades em C # / Python permitem substituir uma função pelo que costumava ser um atributo, enquanto ainda permitem que ela seja acessada como um atributo, ou seja, sem alterações. Você nem precisa ter planejado com antecedência.
Se o seu idioma não tem isso, você precisa planejar com antecedência, mas ainda pode apoiá-lo como as pessoas faziam antes, tornando-o uma função desde o início que não faz nada. No começo, isso não fará nada de interessante e parece que deve ser removido, e muitas funções desse tipo nunca são alteradas. Mas, mais tarde, se você perceber que, realmente, sempre que você ligar,
Widget.wtr
precisará remover alguns caracteres especiais, isso não é grande coisa - já é uma função, basta adicionar isso e pronto.TL; DR Esse poderia ser apenas um programador inteligente que planeja antecipadamente mudanças futuras.
fonte
print data
. Então, mais tarde, você percebe que todas as seqüências de caracteres devem estar em maiúsculas - você teria que procurar todas as impressões do programa e mudar paraprint data.upper()
. Mas se você temdef cdata(data): return data
e em todo lugar dizprint cdata(data)
, então você muda paradef cdata(data): return data.upper()
e é a única mudança.Não é inútil, na verdade, pode ser extremamente útil, pois torna seu código mais uniforme e flexível.
Digamos, por exemplo, que você tenha uma lista de pessoas e uma lista suspensa para o usuário selecionar se queremos ver "todos" ou apenas aqueles que são "masculinos" ou "femininos".
Você pode manipular "all" como um caso especial; nesse caso, será necessário um extra se e para verificar esse caso explicitamente, ou você pode ter uma função de filtro que apenas retorna seu parâmetro (por exemplo, permite que tudo passe), designado para ser usado para o caso "all".
fonte
Filter
classe ou interface comMaleFilter
eFemaleFilter
subclasses, e seu código requer algum filtro, é como você lida com um filtro que não faz nada (retorna seu parâmetro inalterado)All
. A função nunca faz nada, mas pode ser substituída por uma que faz.