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, $placeholderou %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 :

  1. 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.
  2. 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 $idfor substituído por " "'; DELETE FROM Table; SELECT * FROM Table WHERE id=' , a execução desta consulta apagará todos os dados da Tabela.

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.formatpode 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 MessageFormatclasse 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 $vartambé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.logfunção pode ser usada como uma printffunçã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

Notas