Zoeken…


Syntaxis

  • 'A string' // maakt een string via een letterlijk lettertype
  • "A string" // maakt een string aan via letterlijk dubbele aanhalingstekens
  • String.new ("A string")
  • % q (een string) // alternatieve syntaxis voor het maken van enkele aanhalingstekens
  • % Q (een tekenreeks) // alternatieve syntaxis voor het maken van tekenreeksen met dubbele aanhalingstekens

Verschil tussen String-literals met enkele en dubbele quotes

Het belangrijkste verschil is dat String literalen met dubbele aanhalingstekens stringinterpolaties en de volledige set escape-reeksen ondersteunen.

Ze kunnen bijvoorbeeld willekeurige Ruby-uitdrukkingen via interpolatie bevatten:

# 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

Tekenreeksen met dubbele aanhalingstekens ondersteunen ook de volledige reeks escape-reeksen, inclusief "\n" , "\t" ...

puts 'Hello\nWorld'
# Hello\nWorld

puts "Hello\nWorld"
# Hello
# World

... terwijl tekenreeksen met enkele aanhalingstekens geen escape-reeksen ondersteunen, maar de minimale set gebruiken die nodig is voor tekenreeksen met enkele aanhalingstekens: letterlijke enkele aanhalingstekens en backslashes, respectievelijk '\'' en '\\' .

Een string maken

Ruby biedt verschillende manieren om een String object te maken. De meest gebruikelijke manier is om enkele of dubbele aanhalingstekens te gebruiken om een " letterlijke tekenreeks " te maken:

s1 = 'Hello'
s2 = "Hello"

Het belangrijkste verschil is dat dubbele letterreeksen een beetje flexibeler zijn omdat ze interpolatie en sommige backslash-escape-reeksen ondersteunen.

Er zijn ook verschillende andere mogelijke manieren om een letterlijke tekenreeks te maken met behulp van willekeurige tekenreeksscheidingstekens. Een willekeurig string-scheidingsteken is een % gevolgd door een bijpassend paar scheidingstekens:

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

Ten slotte kunt u de reeks %q en %Q , die equivalent zijn aan ' en " ":

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 en %Q zijn nuttig wanneer de tekenreeks enkele aanhalingstekens, dubbele aanhalingstekens of een combinatie van beide bevat. Op deze manier hoeft u niet te ontsnappen aan de inhoud:

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

U kunt verschillende scheidingstekens gebruiken, zolang er maar een paar is:

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

String-aaneenschakeling

Tekenreeksen samenvoegen met de operator + :

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

puts s1 + s2 + s3
# => Hello World

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

Of met de operator << :

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

Merk op dat de operator << het object aan de linkerkant wijzigt.

Je kunt ook strings vermenigvuldigen, bijv

"wow" * 3
# => "wowwowwow"

Stringinterpolatie

Het scheidingsteken met dubbele aanhalingstekens " en %Q reeks ondersteunt stringinterpolatie met #{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

Case manipulatie

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

Deze vier methoden wijzigen de oorspronkelijke ontvanger niet. Bijvoorbeeld,

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

Er zijn vier vergelijkbare methoden die dezelfde acties uitvoeren, maar de oorspronkelijke ontvanger wijzigen.

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

Bijvoorbeeld,

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

Opmerkingen:

  • voorafgaand aan Ruby 2.4 verwerken deze methoden geen unicode.

Een string splitsen

String#split splitst een String in een Array basis van een scheidingsteken.

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

Een lege String resulteert in een lege Array :

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

Een niet-overeenkomend scheidingsteken resulteert in een Array met één item:

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

U kunt een tekenreeks ook splitsen met reguliere expressies:

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

Het scheidingsteken is optioneel, standaard wordt een string op witruimte gesplitst:

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

Deelnemen aan Strings

Array#join voegt een Array aan een String , gebaseerd op een scheidingsteken:

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

Het scheidingsteken is optioneel en is standaard een lege String .

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

Een lege Array resulteert in een lege String , ongeacht welk scheidingsteken wordt gebruikt.

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

Multiline snaren

De eenvoudigste manier om een string met meerdere regels te maken, is om gewoon meerdere regels tussen aanhalingstekens te gebruiken:

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."

Het grootste probleem met die techniek is dat als de string een citaat bevat, deze de syntaxis van de string verbreekt. Om het probleem te omzeilen, kunt u in plaats daarvan een heredoc gebruiken:

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 ondersteunt hier documenten in shell-stijl met <<EOT , maar de afsluitende tekst moet de regel beginnen. Dat verprutst code-inspringing, dus er is niet veel reden om die stijl te gebruiken. Helaas zal de string inspringen, afhankelijk van hoe de code zelf is ingesprongen.

Ruby 2.3 lost het probleem op door de introductie van <<~ die overtollige voorloopspaties verwijdert:

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

Percent Strings werken ook om multiline strings te maken:

%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
)

Er zijn een paar manieren om interpolatie en escape-reeksen te voorkomen:

  • Enkele quote in plaats van dubbele quote: '\n is a carriage return.'

  • Kleine letter q in een procentreeks: %q[#{not-a-variable}]

  • Citeer de terminale string in een heredoc:

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

Opgemaakte tekenreeksen

Ruby kan een reeks waarden in een string injecteren door eventuele tijdelijke aanduidingen te vervangen door de waarden uit de geleverde reeks.

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

De plaatshouders worden weergegeven met twee %s en de waarden worden geleverd door de array ['Hello', 'br3nt'] . De operator % geeft de string de opdracht om de waarden van de array te injecteren.

Vervangende tekenreeksen

De methode tr retourneert een kopie van een tekenreeks waarbij de tekens van het eerste argument worden vervangen door de tekens van het tweede argument.

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

Alleen de eerste optreden van een patroon vervangen door een andere uitdrukking gebruiken sub methode

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

Als u alle exemplaren van een patroon met die uitdrukking wilt vervangen, gebruikt u gsub

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

Om tekens te verwijderen, voert u een lege string in voor de tweede parameter

U kunt ook reguliere expressies gebruiken in al deze methoden.

Het is belangrijk op te merken dat deze methoden alleen een nieuw exemplaar van een string retourneren en de string niet zullen wijzigen. Om dat te doen, moet je de tr! , sub! en gsub! methoden respectievelijk.

Inzicht in de gegevens in een string

In Ruby is een tekenreeks alleen een reeks bytes samen met de naam van een codering (zoals UTF-8 , US-ASCII , ASCII-8BIT ) die aangeeft hoe u die bytes als tekens kunt interpreteren.

Ruby-tekenreeksen kunnen worden gebruikt om tekst vast te houden (in principe een reeks tekens), in welk geval meestal de UTF-8-codering wordt gebruikt.

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

Ruby-strings kunnen ook worden gebruikt om binaire gegevens (een reeks bytes) te bevatten, in welk geval meestal de ASCII-8BIT-codering wordt gebruikt.

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

Het is mogelijk dat de reeks bytes in een string niet overeenkomt met de codering, wat resulteert in fouten als u de string probeert te gebruiken.

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

Stringvervanging

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"

Zie String % docs en Kernel :: sprintf voor meer informatie.

String begint met

Om te bepalen of een string met een patroon begint, start_with? methode komt van pas

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

U kunt ook de positie van het patroon controleren met de index

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

String eindigt op

Om te bepalen of een string eindigt met een patroon, is de end_with? methode komt van pas

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

Tekenreeksen positioneren

In Ruby kunnen strings links-gerechtvaardigd, rechts-gerechtvaardigd of gecentreerd worden

Gebruik de methode ljust om de tekenreeks links te rechtvaardigen. Dit neemt twee parameters aan, een geheel getal dat het aantal tekens van de nieuwe string vertegenwoordigt en een string die het in te vullen patroon vertegenwoordigt.

Als het gehele getal groter is dan de lengte van de oorspronkelijke tekenreeks, wordt de nieuwe tekenreeks uitgelijnd met de optionele tekenreeksparameter die de resterende ruimte inneemt. Als de parameter string niet wordt opgegeven, wordt de string opgevuld met spaties.

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

Gebruik de methode rjust om een tekenreeks rechts te rechtvaardigen. Dit neemt twee parameters aan, een geheel getal dat het aantal tekens van de nieuwe string vertegenwoordigt en een string die het in te vullen patroon vertegenwoordigt.

Als het gehele getal groter is dan de lengte van de oorspronkelijke tekenreeks, wordt de nieuwe tekenreeks rechts uitgelijnd, waarbij de optionele tekenreeksparameter de resterende ruimte inneemt. Als de parameter string niet wordt opgegeven, wordt de string opgevuld met spaties.

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

Gebruik de center methode om een string te center . Dit neemt twee parameters op, een geheel getal dat de breedte van de nieuwe string vertegenwoordigt en een string, waarmee de oorspronkelijke string wordt opgevuld. De tekenreeks wordt uitgelijnd met het midden.

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow