Ricerca…


Sintassi

  • 'Una stringa' // crea una stringa tramite letterale con quotatura singola
  • "Una stringa" // crea una stringa tramite letterale a virgolette doppie
  • String.new ("Una stringa")
  • % q (A string) // sintassi alternativa per la creazione di stringhe con quotatura singola
  • % Q (A string) // sintassi alternativa per la creazione di stringhe con doppie virgolette

Differenza tra valori letterali stringa a virgolette singole e virgolette

La differenza principale è che i letterali String virgolette doppie supportano le interpolazioni di stringhe e il set completo di sequenze di escape.

Ad esempio, possono includere espressioni Ruby arbitrarie tramite interpolazione:

# Single-quoted strings don't support interpolation
puts 'Now is #{Time.now}'
# Now is #{Time.now}

# Double-quoted strings support interpolation
puts "Now is #{Time.now}"
# Now is 2016-07-21 12:43:04 +0200

Le stringhe con doppia citazione supportano anche l' intera serie di sequenze di escape, tra cui "\n" , "\t" ...

puts 'Hello\nWorld'
# Hello\nWorld

puts "Hello\nWorld"
# Hello
# World

... mentre le stringhe a virgolette singole non supportano sequenze di escape, è utile il set minimo necessario per le stringhe con quotatura singola: virgolette singole letterali e barre rovesciate, rispettivamente '\'' e '\\' .

Creare una stringa

Ruby offre diversi modi per creare un oggetto String . Il modo più comune consiste nell'utilizzare virgolette singole o doppie per creare una " stringa letterale ":

s1 = 'Hello'
s2 = "Hello"

La differenza principale è che i letterali stringa con virgolette doppie sono un po 'più flessibili in quanto supportano l'interpolazione e alcune sequenze di escape backslash.

Ci sono anche molti altri modi possibili per creare una stringa letterale usando delimitatori di stringhe arbitrari. Un delimitatore di stringhe arbitrario è un % seguito da una coppia di delimitatori corrispondente:

%(A string)
%{A string}
%<A string>
%|A string|
%!A string!

Infine, puoi usare la sequenza %q e %Q , che sono equivalenti a ' e " ":

puts %q(A string)
# A string
puts %q(Now is #{Time.now})
# Now is #{Time.now}

puts %Q(A string)
# A string
puts %Q(Now is #{Time.now})
# Now is 2016-07-21 12:47:45 +0200

%q sequenze %q e %Q sono utili quando la stringa contiene virgolette singole, virgolette doppie o un mix di entrambi. In questo modo, non è necessario sfuggire al contenuto:

%Q(<a href="/profile">User's profile<a>)

Puoi utilizzare diversi delimitatori, purché vi sia una coppia corrispondente:

%q(A string)
%q{A string}
%q<A string>
%q|A string|
%q!A string!

Concatenazione di stringhe

Stringhe concatenate con l'operatore + :

s1 = "Hello"
s2 = " "
s3 = "World"

puts s1 + s2 + s3
# => Hello World

s = s1 + s2 + s3
puts s
# => Hello World

O con l'operatore << :

s = 'Hello'
s << ' '
s << 'World'
puts s
# => Hello World

Si noti che l'operatore << modifica l'oggetto sul lato sinistro.

Puoi anche moltiplicare le stringhe, ad es

"wow" * 3
# => "wowwowwow"

Interpolazione a stringa

Il delimitatore a virgolette doppie " e %Q sequenza %Q supporta l'interpolazione delle stringhe usando #{ruby_expression} :

puts "Now is #{Time.now}"
# Now is Now is 2016-07-21 12:47:45 +0200

puts %Q(Now is #{Time.now})
# Now is Now is 2016-07-21 12:47:45 +0200

Manipolazione del caso

"string".upcase     # => "STRING"
"STRING".downcase   # => "string"
"String".swapcase   # => "sTRING"
"string".capitalize # => "String"

Questi quattro metodi non modificano il ricevitore originale. Per esempio,

str = "Hello"
str.upcase # => "HELLO"
puts str   # => "Hello"

Esistono quattro metodi simili che eseguono le stesse azioni ma modificano il ricevitore originale.

"string".upcase!     # => "STRING"
"STRING".downcase!   # => "string"
"String".swapcase!   # => "sTRING"
"string".capitalize! # => "String"

Per esempio,

str = "Hello"
str.upcase!  # => "HELLO"
puts str     # => "HELLO"

Gli appunti:

  • prima di Ruby 2.4 questi metodi non gestiscono unicode.

Divisione di una stringa

String#split divide una String in una Array , in base a un delimitatore.

"alpha,beta".split(",")
# => ["alpha", "beta"]

Una String vuota risulta in una Array vuota:

"".split(",")
# => []

Un delimitatore non corrispondente risulta in una Array contenente un singolo elemento:

"alpha,beta".split(".")
# => ["alpha,beta"]

Puoi anche dividere una stringa usando le espressioni regolari:

"alpha, beta,gamma".split(/, ?/)
# => ["alpha", "beta", "gamma"]

Il delimitatore è facoltativo, per impostazione predefinita una stringa viene divisa in spazi vuoti:

"alpha beta".split
# => ["alpha", "beta"] 

Unione di stringhe

Array#join unisce a una Array in una String , in base a un delimitatore:

["alpha", "beta"].join(",")
# => "alpha,beta"

Il delimitatore è facoltativo e il valore predefinito è una String vuota.

["alpha", "beta"].join
# => "alphabeta"

Una Array vuota risulta in una String vuota, indipendentemente dal delimitatore utilizzato.

[].join(",")
# => ""

Stringhe multilinea

Il modo più semplice per creare una stringa multilinea è utilizzare semplicemente più righe tra virgolette:

address = "Four score and seven years ago our fathers brought forth on this
continent, a new nation, conceived in Liberty, and dedicated to the
proposition that all men are created equal."

Il problema principale di questa tecnica è che se la stringa include una citazione, interromperà la sintassi della stringa. Per ovviare al problema, puoi utilizzare invece un heredoc :

puts <<-RAVEN
  Once upon a midnight dreary, while I pondered, weak and weary, 
  Over many a quaint and curious volume of forgotten lore— 
      While I nodded, nearly napping, suddenly there came a tapping, 
  As of some one gently rapping, rapping at my chamber door. 
  "'Tis some visitor," I muttered, "tapping at my chamber door— 
              Only this and nothing more." 
  RAVEN

Ruby supporta i documenti in stile shell qui con <<EOT , ma il testo che chiude deve iniziare la riga. Ciò rovina il rientro del codice, quindi non c'è un motivo in più per usare questo stile. Sfortunatamente, la stringa avrà indentazioni a seconda di come il codice stesso sia rientrato.

Ruby 2.3 risolve il problema introducendo <<~ che rimuove gli spazi in eccesso:

2.3
def build_email(address)
  return (<<~EMAIL)
    TO: #{address}

    To Whom It May Concern:

    Please stop playing the bagpipes at sunrise!
                     
    Regards,
    Your neighbor               
  EMAIL
end

Le stringhe percentuali funzionano anche per creare stringhe multilinea:

%q(
HAMLET        Do you see yonder cloud that's almost in shape of a camel?
POLONIUS        By the mass, and 'tis like a camel, indeed.
HAMLET        Methinks it is like a weasel.
POLONIUS        It is backed like a weasel.
HAMLET        Or like a whale?
POLONIUS        Very like a whale
)

Esistono alcuni modi per evitare l'interpolazione e le sequenze di escape:

  • Virgolette singole invece di virgolette doppie: '\n is a carriage return.'

  • Minuscolo q in una stringa percentuale: %q[#{not-a-variable}]

  • Cita solo la stringa terminale in un heredoc:

    <<-'CODE'
       puts 'Hello world!'
    CODE
    

Stringhe formattate

Ruby può iniettare una matrice di valori in una stringa sostituendo qualsiasi segnaposto con i valori dell'array fornito.

"Hello %s, my name is %s!" % ['World', 'br3nt']
# => Hello World, my name is br3nt!

I segnaposto sono rappresentati da due %s e i valori sono forniti dall'array ['Hello', 'br3nt'] . L'operatore % ordina alla stringa di iniettare i valori dell'array.

Sostituzioni di carattere stringa

Il metodo tr restituisce una copia di una stringa in cui i caratteri del primo argomento sono sostituiti dai caratteri del secondo argomento.

"string".tr('r', 'l') # => "stling"

Per sostituire solo la prima occorrenza di un motivo con un'altra espressione, utilizzare il metodo sub

"string ring".sub('r', 'l') # => "stling ring"

Se si desidera sostituire tutte le occorrenze di un modello con tale espressione, utilizzare gsub

"string ring".gsub('r','l') # => "stling ling" 

Per cancellare i caratteri, passa una stringa vuota per il secondo parametro

Puoi anche usare espressioni regolari in tutti questi metodi.

È importante notare che questi metodi restituiranno solo una nuova copia di una stringa e non modificheranno la stringa sul posto. Per farlo, devi usare il tr! , sub! e gsub! metodi rispettivamente.

Capire i dati in una stringa

In Ruby, una stringa è solo una sequenza di byte insieme al nome di una codifica (come UTF-8 , US-ASCII , ASCII-8BIT ) che specifica come interpretare quei byte come caratteri.

Le stringhe di Ruby possono essere utilizzate per contenere il testo (in pratica una sequenza di caratteri), nel qual caso viene utilizzata solitamente la codifica UTF-8.

"abc".bytes  # => [97, 98, 99]
"abc".encoding.name  # => "UTF-8"

Le stringhe di Ruby possono anche essere utilizzate per contenere dati binari (una sequenza di byte), nel qual caso viene utilizzata solitamente la codifica ASCII-8BIT.

[42].pack("i").encoding  # => "ASCII-8BIT"

È possibile che la sequenza di byte in una stringa non corrisponda alla codifica, causando errori se si tenta di utilizzare la stringa.

"\xFF \xFF".valid_encoding? # => false
"\xFF \xFF".split(' ')      # ArgumentError: invalid byte sequence in UTF-8

Sostituzione delle stringhe

p "This is %s" % "foo"
# => "This is foo"

p "%s %s %s" % ["foo", "bar", "baz"]
# => "foo bar baz"

p "%{foo} == %{foo}" % {:foo => "foo" }
# => "foo == foo"

Vedi String % docs e Kernel :: sprintf per maggiori dettagli.

La stringa inizia con

Per scoprire se una stringa inizia con un pattern, il start_with? il metodo è utile

str = "zebras are cool"
str.start_with?("zebras")      => true

Puoi anche controllare la posizione del pattern con l' index

str = "zebras are cool"
str.index("zebras").zero?      => true

La stringa finisce con

Per scoprire se una stringa termina con un pattern, end_with? il metodo è utile

str = "I like pineapples"
str.end_with?("pineaaples")      => false

Posizionamento delle stringhe

In Ruby, le stringhe possono essere giustificate a sinistra, giustificate a destra o centrate

Per la stringa di giustificazione a sinistra, utilizzare il metodo ljust . Questo accetta due parametri, un numero intero che rappresenta il numero di caratteri della nuova stringa e una stringa, che rappresenta il modello da riempire.

Se il numero intero è maggiore della lunghezza della stringa originale, la nuova stringa verrà giustificata a sinistra con il parametro stringa opzionale che occupa lo spazio rimanente. Se il parametro stringa non viene fornito, la stringa verrà riempita di spazi.

str ="abcd"
str.ljust(4)          => "abcd"
str.ljust(10)         => "abcd      "

Per giustificare a destra una stringa, utilizzare il metodo rjust . Questo accetta due parametri, un numero intero che rappresenta il numero di caratteri della nuova stringa e una stringa, che rappresenta il modello da riempire.

Se il numero intero è maggiore della lunghezza della stringa originale, la nuova stringa sarà giustificata a destra con il parametro stringa opzionale che occupa lo spazio rimanente. Se il parametro stringa non viene fornito, la stringa verrà riempita di spazi.

str = "abcd"
str.rjust(4)          => "abcd"
str.rjust(10)         => "      abcd"

Per centrare una corda, usa il metodo center . Questo accetta due parametri, un numero intero che rappresenta la larghezza della nuova stringa e una stringa, con la quale verrà riempita la stringa originale. La stringa sarà allineata al centro.

str = "abcd"
str.center(4)          => "abcd"
str.center(10)         => "   abcd   "


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow