O sinal de mais +
é usado para adição e concatenação de cadeias, mas seu companheiro: o sinal de menos -
, geralmente não é visto para aparar cadeias ou algum outro caso que não seja a subtração. Qual poderia ser o motivo ou as limitações para isso?
Considere o seguinte exemplo em JavaScript:
var a = "abcdefg";
var b = "efg";
a-b == NaN
// but
a+b == "abcdefgefg"
coding-standards
history
operators
overload
Digvijay Yadav
fonte
fonte
+
operador binário seja sobrecarregado com os dois significados totalmente independentes: "adição numérica" e "concatenação de string". Felizmente, algumas linguagens fornecem um operador de concatenação separado, como.
(Perl5, PHP),~
(Perl6),&
(VB),++
(Haskell),…->
(pense em remover o acesso de membro em C, já que as chamadas de método virtual envolvem necessariamente indireto como ponteiro). Não há lei do design de idiomas que exija chamadas de método / acesso de membro para usar um.
operador, embora seja uma convenção cada vez mais comum. Você sabia que o Smalltalk não tem operador de chamada de método? A justaposição simplesobject method
é suficiente.Respostas:
Em resumo, não existem operações particularmente úteis de subtração em strings com as quais as pessoas desejam escrever algoritmos.
O
+
operador geralmente denota a operação de um monóide aditivo , ou seja, uma operação associativa com um elemento de identidade:Faz sentido usar esse operador para coisas como adição de número inteiro, concatenação de strings e união de conjuntos, pois todos eles têm a mesma estrutura algébrica:
E podemos usá-lo para escrever algoritmos úteis, como uma
concat
função que funciona em uma sequência de qualquer coisa "concatenável", por exemplo:Quando a subtração
-
é envolvida, você geralmente fala sobre a estrutura de um grupo , que adiciona um −A inverso para cada elemento A, de modo que:E enquanto isso faz sentido para coisas como subtração de números inteiros e de ponto flutuante, ou até mesmo definir diferenças, não faz muito sentido para seqüências de caracteres e listas. Qual é o inverso de
"foo"
?Existe uma estrutura chamada monóide cancelável , que não possui inversões, mas possui a propriedade cancelamento , de modo que:
Essa é a estrutura que você descreve, onde
"ab" - "b" == "a"
, mas"ab" - "c"
não está definida. Só que não temos muitos algoritmos úteis que usam essa estrutura. Eu acho que se você pensa em concatenação como serialização, a subtração pode ser usada para algum tipo de análise.fonte
+
operação também é comutativa para números, ou sejaA+B == B+A
, o que a torna uma candidata ruim à concatenação de strings. Isso, mais a precedente confusa do operador, faz com que o uso+
de concatenação de cadeias seja um erro histórico. No entanto, é verdade que o uso-
por qualquer operação de corda feito coisas muito piores ....
do Perl; está~
em Perl6, possivelmente outros..text.gz.text
...Como a concatenação de duas seqüências válidas é sempre uma operação válida, mas o oposto não é verdadeiro.
O que deveria
a - b
estar aqui? Realmente não há uma boa maneira de responder a essa pergunta, porque a pergunta em si não é válida.fonte
5 + False
obviamente que deve ser um erro , pois um número não é booleano e um booleano não é um número.(a+b)-b = a
(espero!), Mas(a-b)+b
às vezesa
, às vezes ,a+b
dependendo de seb
é uma substringa
ou não? Que loucura é essa?Porque o
-
operador para manipulação de strings não possui "coesão semântica" suficiente. Os operadores só devem ser sobrecarregados quando estiver absolutamente claro o que a sobrecarga faz com seus operandos, e a subtração de strings não atende a essa barra.Conseqüentemente, as chamadas de método são preferidas:
Na linguagem C #, usamos
+
para concatenação de cadeias porque o formulárioao invés de
é conveniente e sem dúvida mais fácil de ler, mesmo que uma chamada de função seja provavelmente mais "correta", do ponto de vista semântico.
O
+
operador pode realmente significar apenas uma coisa nesse contexto. Isso não é verdade-
, pois a noção de subtração de strings é ambígua (a chamada de funçãoReplace(source, oldValue, newValue)
com""
onewValue
parâmetro remove todas as dúvidas e a função pode ser usada para alterar substrings, não apenas removê-los).O problema, é claro, é que a sobrecarga do operador depende dos tipos que estão sendo passados para o operador e, se você passar uma sequência em que deveria estar um número, poderá obter um resultado que não esperava. Além disso, para muitas concatenações (ou seja, em um loop), um
StringBuilder
objeto é preferível, pois cada uso+
cria uma nova string e o desempenho pode sofrer. Portanto, o+
operador nem sequer é apropriado em todos os contextos.Existem sobrecargas de operador que possuem melhor coesão semântica do que o
+
operador para concatenação de cadeias. Aqui está um que adiciona dois números complexos:fonte
A linguagem Groovy permite
-
:retorna:
E:
retorna:
E:
retorna:
fonte
('ABABABABA' + 'B') - 'B'
não é nem de longe o mesmo que o valor inicial'ABABABABA'
.(A + B) - A == B
para todos os A e B. Posso chamar isso de subtração esquerda?++
para concatenação. Funciona em qualquer lista e uma string é apenas uma lista de caracteres. Também possui\\
, o que remove a primeira ocorrência de cada elemento no argumento da direita do argumento da esquerda.O sinal de mais provavelmente faz sentido contextualmente em mais casos, mas um contra-exemplo (talvez uma exceção que comprove a regra) no Python é o objeto set, que fornece,
-
mas não+
:Não faz sentido usar o
+
sinal porque a intenção pode ser ambígua - isso significa definir interseção ou união? Em vez disso, ele usa|
para união e&
interseção:fonte
set('abc') ^ set('bcd')
retornaset(['a', 'd'])
, se você estiver perguntando sobre a diferença simétrica."
-
" é usado em algumas palavras compostas (por exemplo, "no local") para unir as diferentes partes na mesma palavra. Por que não usamos "-
" para unir diferentes strings em linguagens de programação? Eu acho que faria todo o sentido! Para o inferno com esse+
absurdo!No entanto, vamos tentar olhar para isso de um ângulo um pouco mais abstrato.
Como você definiria álgebra de cordas? Quais operações você teria e quais leis seriam válidas para eles? Quais seriam suas relações?
Lembre-se, pode não haver absolutamente nenhuma ambiguidade! Todo caso possível deve ser bem definido, mesmo que isso signifique dizer que não é possível fazer isso! Quanto menor a sua álgebra, mais fácil isso é feito.
Por exemplo, o que realmente significa adicionar ou subtrair duas strings?
Se você adicionar duas strings (por exemplo, let
a = "aa"
eb = "bb"
), obteriaaabb
o resultado dea + b
?Que tal
b + a
? Seria issobbaa
? Por que nãoaabb
? O que acontece se você subtrairaa
o resultado da sua adição? Sua string teria um conceito de quantidade negativaaa
?Agora volte ao início desta resposta e substitua em
spaceshuttle
vez da sequência. Para generalizar, por que alguma operação está definida ou não está definida para qualquer tipo?O que estou tentando enfatizar é que não há nada que o impeça de criar uma álgebra para qualquer coisa. Pode ser difícil encontrar operações significativas, ou mesmo operações úteis para isso.
Para strings, concatenar é praticamente o único que eu já vi. Não importa qual símbolo é usado para representar a operação.
fonte
'xy' * 3 == 'xyxyxy'
?