Interpolação de string - String interpolation
Em programação de computador , a interpolação de string (ou interpolação de variável , substituição de variável ou expansão de variável ) é o processo de avaliação de um literal de string contendo um ou mais marcadores de posição , produzindo um resultado no qual os marcadores de posição são substituídos por seus valores correspondentes. É uma forma de processamento de modelo simples ou, em termos formais, uma forma de quase citação (ou interpretação de substituição lógica ). A interpolação de strings permite uma formatação e especificação de conteúdo mais fáceis e intuitivas em comparação com a concatenação de strings .
A interpolação de string é comum em muitas linguagens de programação que fazem uso intenso de representações de string de dados, como Apache Groovy , Julia , Kotlin , Perl , PHP , Python , Ruby , Scala , Swift , Tcl e a maioria dos shells Unix . Normalmente, são oferecidos dois modos de expressão literal: um com interpolação habilitada e outro sem (denominado string bruta ). Os placeholders são geralmente representados por um sigilo simples ou nomeado (normalmente $
ou %
), por exemplo, $placeholder
ou %123
. A expansão da string geralmente ocorre em tempo de execução .
Variações
Algumas linguagens não oferecem interpolação de string, em vez de oferecer uma função padrão em que um parâmetro é a string de formato printf e outro (s) fornecem os valores para cada espaço reservado.
Ruby usa o #
símbolo para interpolação e permite a interpolação de qualquer expressão, não apenas variáveis. Outras linguagens podem suportar uma interpolação mais avançada com uma função de formatação especial, como printf
, em que o primeiro argumento, o formato , especifica o padrão no qual os argumentos restantes são substituídos.
Algoritmos
Existem dois tipos principais de algoritmos de expansão de variável para interpolação de variável :
- Substituir e expandir marcadores de posição : criando uma nova string a partir da original, por meio de operações de localização e substituição. Encontre a referência de variável (espaço reservado), substitua-a por seu valor de variável. Este algoritmo não oferece estratégia de cache.
- Dividir e unir string : dividir a string em uma matriz e mesclá-la com a matriz de valores correspondente; em seguida, junte os itens por concatenação. A string dividida pode ser armazenada em cache para reutilização.
Problemas de segurança
A interpolação de strings, como a concatenação de strings, pode causar problemas de segurança. Se os dados de entrada do usuário forem filtrados ou escapados incorretamente, o sistema será exposto a ataques de injeção de SQL , injeção de script , injeção de entidade externa XML (XXE) e script entre sites (XSS).
Um exemplo de injeção SQL:
query = "SELECT x, y, z FROM Table WHERE id='$id'
"
Se $id
for substituído por " "';
, a execução desta consulta apagará todos os dados da Tabela.
DELETE FROM Table; SELECT * FROM Table WHERE id='
Exemplos
O seguinte código Perl funciona de forma idêntica em PHP :
$name = "Alice";
print "${name} said Hello World to the crowd of people.";
produz a saída: Alice said Hello World to the crowd of people.
ABAP
DATA(apples) = 4.
WRITE |I have { apples } apples|.
O resultado será:
I have 4 apples
Bash
apples=4
echo "I have $apples apples"
# or
echo "I have ${apples} apples"
O resultado será:
I have 4 apples
Boo
apples = 4
print("I have $(apples) apples")
# or
print("I have {0} apples" % apples)
O resultado será:
I have 4 apples
C #
var apples = 4;
var bananas = 3;
Console.WriteLine($"I have {apples} apples");
Console.WriteLine($"I have {apples + bananas} fruits");
O resultado será:
I have 4 apples
I have 7 fruits
ColdFusion Markup Language
Sintaxe do script ColdFusion Markup Language (CFML):
apples = 4;
writeOutput("I have #apples# apples");
Sintaxe da tag:
<cfset apples = 4>
<cfoutput>I have #apples# apples</cfoutput>
O resultado será:
I have 4 apples
CoffeeScript
apples = 4
console.log "I have #{apples} apples"
O resultado será:
I have 4 apples
Dardo
int apples = 4, bananas = 3;
print('I have $apples apples.');
print('I have ${apples+bananas} fruit.');
O resultado será:
I have 4 apples.
I have 7 fruit.
Ir
lang := "Golang"
apples := 3
fmt.Printf("I am a %s developer.\n", lang)
fmt.Printf("I have %d apples.\n", apples)
O resultado será:
I am a Golang developer.
I have 3 apples.
Groovy
No groovy, as strings interpoladas são conhecidas como GStrings:
def quality = "superhero"
final age = 52
def sentence = "A developer is a $quality, if he is ${age <= 42 ? "young" : "seasoned"}"
println sentence
O resultado será:
A developer is a superhero if he is seasoned
Haxe
var apples = 4;
var bananas = 3;
trace('I have $apples apples.');
trace('I have ${apples+bananas} fruit.');
O resultado será:
I have 4 apples.
I have 7 fruit.
Java
Na falta de verdadeiras strings interpoladas, Java usa funções auxiliares como uma solução alternativa.
Nas versões 5 e posteriores do Java, o método estático String.format
pode ser usado para interpolação:
int apples = 4;
int bananas = 3;
System.out.println(String.format("I have %s apples and %s bananas", apples, bananas));
System.out.println(String.format("I have %s fruit", apples + bananas));
No Java versão 1.1 e superior, a MessageFormat
classe pode formatar conjuntos de objetos usando marcadores de posição:
Object[] testArgs = {Long.valueOf(3), "MyDisk"};
MessageFormat form = new MessageFormat(
"The disk \"{1}\" contains {0} file(s).");
System.out.println(form.format(testArgs));
JavaScript
JavaScript , a partir do padrão ECMAScript 2015 (ES6), suporta interpolação de string usando crases ``
. Esse recurso é chamado de literais de modelo . Aqui está um exemplo:
const apples = 4;
const bananas = 3;
console.log(`I have ${apples} apples`);
console.log(`I have ${apples + bananas} fruit`);
O resultado será:
I have 4 apples
I have 7 fruit
Literais de modelo também podem ser usados para strings de várias linhas:
console.log(`This is the first line of text.
This is the second line of text.`);
O resultado será:
This is the first line of text.
This is the second line of text.
Julia
apples = 4
bananas = 3
print("I have $apples apples and $bananas bananas, making $(apples + bananas) pieces of fruit in total.")
O resultado será:
I have 4 apples and 3 bananas, making 7 pieces of fruit in total.
Kotlin
val quality = "superhero"
val apples = 4
val bananas = 3
val sentence = "A developer is a $quality. I have ${apples + bananas} fruit"
println(sentence)
O resultado será:
A developer is a superhero. I have 7 fruit
Nemerle
def apples = 4;
def bananas = 3;
Console.WriteLine($"I have $apples apples.");
Console.WriteLine($"I have $(apples + bananas) fruit.");
Ele também oferece suporte a recursos de formatação avançados, como:
def fruit = ["apple", "banana"];
Console.WriteLine($<#I have ..$(fruit; "\n"; f => f + "s")#>);
O resultado será:
apples
bananas
Shell de próxima geração
A sintaxe recomendada é ${expr}
que $var
também é suportado:
quality = "superhero"
apples = 4
bananas = 3
sentence = "A developer is a $quality. I have ${apples + bananas} fruit"
echo(sentence)
O resultado será:
A developer is a superhero. I have 7 fruit
Nim
O Nim fornece interpolação de strings por meio do módulo strutils. Literais de string formatados inspirados na string F do Python são fornecidos por meio do módulo strformat, a macro strformat verifica se a string de formato está bem formada e digitada e, em seguida, são expandidos para o código-fonte Nim em tempo de compilação.
import strutils, strformat
var apples = 4
var bananas = 3
echo "I have $1 apples".format(apples)
echo fmt"I have {apples} apples"
echo fmt"I have {apples + bananas} fruits"
# Multi-line
echo fmt"""
I have
{apples} apples"""
# Debug the formatting
echo fmt"I have {apples=} apples"
# Custom openChar and closeChar characters
echo fmt("I have (apples) {apples}", '(', ')')
# Backslash inside the formatted string literal
echo fmt"""{ "yep\nope" }"""
O resultado será:
I have 4 apples
I have 4 apples
I have 7 fruits
I have
4 apples
I have apples=4 apples
I have 4 {apples}
yep
ope
Nix
let numberOfApples = "4";
in "I have ${numberOfApples} apples"
O resultado será:
I have 4 apples
ParaSail
const Apples := 4
const Bananas := 3
Println ("I have `(Apples) apples.\n")
Println ("I have `(Apples+Bananas) fruit.\n")
O resultado será:
I have 4 apples.
I have 7 fruit.
Perl
my $apples = 4;
my $bananas = 3;
print "I have $apples apples.\n";
print "I have @{[$apples+$bananas]} fruit.\n"; # Uses the Perl array (@) interpolation.
O resultado será:
I have 4 apples.
I have 7 fruit.
PHP
<?php
$apples = 5;
$bananas = 3;
echo "There are $apples apples and $bananas bananas.";
echo "\n";
echo "I have {$apples} apples and {$bananas} bananas.";
O resultado será:
There are 5 apples and 3 bananas.
I have 5 apples and 3 bananas.
Pitão
# in all versions
apples = 4
bananas = 3
print("I have %d apples and %d bananas" % (apples, bananas)) # no longer recommended
print("I have %(apples)d apples and %(bananas)d bananas" % locals()) # no longer recommended
# with Python 2.6+
print("I have {0} apples and {1} bananas".format(apples, bananas))
print("I have {a} apples and {b} bananas".format(b=bananas, a=apples))
# with Python 2.7+
print("I have {} apples and {} bananas".format(apples, bananas))
# or with Python 3.6+
print(f"I have {apples} apples and {bananas} bananas")
O resultado será:
I have 4 apples and 3 bananas
Rubi / Cristal
apples = 4
puts "I have #{apples} apples"
# or
puts "I have %s apples" % apples
# or
puts "I have %{a} apples" % {a: apples}
O resultado será:
I have 4 apples
Ferrugem
Na falta de strings interpoladas verdadeiras, o Rust fornece uma solução alternativa por meio do módulo std :: fmt , que é conectado por meio de várias macros, como format! , escreva! e imprima! . Essas macros são convertidas em código-fonte do Rust em tempo de compilação, em que cada argumento interage com um formatador . O formatador oferece suporte a parâmetros posicionais , parâmetros nomeados , tipos de argumento e definição de várias características de formatação .
let (apples, bananas) = (4, 3);
println!("There are {} apples and {} bananas.", apples, bananas);
O resultado será:
There are 4 apples and 3 bananas.
Scala
Scala 2.10+ implementou os seguintes interpoladores de string: s, f e raw. Também é possível escrever personalizados ou substituir os padrões.
O interpolador f é uma macro do compilador que reescreve uma string de formato com expressões incorporadas como uma invocação de String.format. Ele verifica se a string de formato está bem formada e digitada.
Os interpoladores padrão
A interpolação de string do Scala 2.10 + permite embutir referências de variáveis diretamente em literais de string processados. Aqui está um exemplo:
val apples = 4
val bananas = 3
//before Scala 2.10
printf("I have %d apples\n", apples)
println("I have %d apples" format apples)
//Scala 2.10+
println(s"I have $apples apples")
println(s"I have ${apples + bananas} fruits")
println(f"I have $apples%d apples")
O resultado será:
I have 4 apples
Sciter (tiscript)
No Sciter, qualquer função com nome começando em $ é considerada uma função de interpolação e, portanto, a interpolação é personalizável e sensível ao contexto:
var apples = 4
var bananas = 3
var domElement = ...;
domElement.$content(<p>I have {apples} apples</p>);
domElement.$append(<p>I have {apples + bananas} fruits</p>);
Onde
domElement.$content(<p>I have {apples} apples</p>);
é compilado para isto:
domElement.html = "<p>I have " + apples.toHtmlString() + " apples</p>";
Snobol
apples = 4 ; bananas = 3
Output = "I have " apples " apples."
Output = "I have " (apples + bananas) " fruit."
O resultado será:
I have 4 apples.
I have 7 fruit.
Rápido
Em Swift , um novo valor de String pode ser criado a partir de uma mistura de constantes, variáveis, literais e expressões, incluindo seus valores dentro de um literal de string. Cada item inserido no literal de string é envolvido por um par de parênteses, prefixado por uma barra invertida.
let apples = 4
print("I have \(apples) apples")
O resultado será:
I have 4 apples
Tcl
A Linguagem de Comando da Ferramenta sempre suportou a interpolação de strings em todas as strings delimitadas por aspas.
set apples 4
puts "I have $apples apples."
O resultado será:
I have 4 apples.
Para formatar - e não simplesmente substituir - os valores, existe uma função de formatação.
set apples 4
puts [format "I have %d apples." $apples]
TypeScript
A partir da versão 1.4, o TypeScript oferece suporte à interpolação de strings usando crases ``
. Aqui está um exemplo:
var apples: number = 4;
console.log(`I have ${apples} apples`);
O resultado será:
I have 4 apples
A console.log
função pode ser usada como uma printf
função. O exemplo acima pode ser reescrito, desta forma:
var apples: number = 4;
console.log("I have %d apples", apples);
A saída permanece a mesma.
Visual básico
A partir do Visual Basic 14, há suporte para String Interpolation no Visual Basic.
name = "Tom"
Console.WriteLine($"Hello, {name}")
irá imprimir "Olá, Tom".
Veja também
- Concatenação
- Validação de entrada imprópria
- string de formato printf
- Quase cotação
- Literal de string
- Substituição