class

String

Inherits Comparable < Reference < Object

A String represents an immutable sequence of UTF-8 characters.

A String is typically created with a string literal, enclosing UTF-8 characters in double quotes:

"hello world"

See String literals in the language reference.

A backslash can be used to denote some characters inside the string:

"\"" # double quote
"\\" # backslash
"\e" # escape
"\f" # form feed
"\n" # newline
"\r" # carriage return
"\t" # tab
"\v" # vertical tab

You can use a backslash followed by an u and four hexadecimal characters to denote a unicode codepoint written:

"\u0041" # == "A"

Or you can use curly braces and specify up to six hexadecimal numbers (0 to 10FFFF):

"\u{41}" # == "A"

A string can span multiple lines:

"hello
      world" # same as "hello\n      world"

Note that in the above example trailing and leading spaces, as well as newlines, end up in the resulting string. To avoid this, you can split a string into multiple lines by joining multiple literals with a backslash:

"hello " \
"world, " \
"no newlines" # same as "hello world, no newlines"

Alternatively, a backslash followed by a newline can be inserted inside the string literal:

"hello \
     world, \
     no newlines" # same as "hello world, no newlines"

In this case, leading whitespace is not included in the resulting string.

If you need to write a string that has many double quotes, parentheses, or similar characters, you can use alternative literals:

# Supports double quotes and nested parentheses
%(hello ("world")) # same as "hello (\"world\")"

# Supports double quotes and nested brackets
%[hello ["world"]] # same as "hello [\"world\"]"

# Supports double quotes and nested curlies
%{hello {"world"}} # same as "hello {\"world\"}"

# Supports double quotes and nested angles
%<hello <"world">> # same as "hello <\"world\">"

To create a String with embedded expressions, you can use string interpolation:

a = 1
b = 2
"sum = #{a + b}" # "sum = 3"

This ends up invoking Object#to_s(IO) on each expression enclosed by #{...}.

If you need to dynamically build a string, use String#build or IO::Memory.

Non UTF-8 valid strings

A string might end up being composed of bytes which form an invalid byte sequence according to UTF-8. This can happen if the string is created via one of the constructors that accept bytes, or when getting a string from String.build or IO::Memory. No exception will be raised, but every byte that doesn't start a valid UTF-8 byte sequence is interpreted as though it encodes the Unicode replacement character (U+FFFD) by itself. For example:

# here 255 is not a valid byte value in the UTF-8 encoding
string = String.new(Bytes[255, 97])
string.valid_encoding? # => false

# The first char here is the unicode replacement char
string.chars # => ['�', 'a']

One can also create strings with specific byte value in them by using octal and hexadecimal escape sequences:

# Octal escape sequences
"\101" # # => "A"
"\12"  # # => "\n"
"\1"   # string with one character with code point 1
"\377" # string with one byte with value 255

# Hexadecimal escape sequences
"\x41" # # => "A"
"\xFF" # string with one byte with value 255

The reason for allowing strings that don't have a valid UTF-8 sequence is that the world is full of content that isn't properly encoded, and having a program raise an exception or stop because of this is not good. It's better if programs are more resilient, but show a replacement character when there's an error in incoming data.

Note that this interpretation only applies to methods inside Crystal; calling #to_slice or #to_unsafe, e.g. when passing a string to a C library, will expose the invalid UTF-8 byte sequences. In particular, Regex's underlying engine may reject strings that are not valid UTF-8, or it may invoke undefined behavior on invalid strings. If this is undesired, #scrub could be used to remove the offending byte sequences first.

NOTE: This type cannot be inherited due to its special memory representation.

Instance methods

=~(other : Regex) : Int32 | Nil
Source
[](pattern : Regex, group : Symbol) : String | Nil

"s"[re, :group] — по имени группы (Symbol; String-вариант в Crystal есть).

Source
[](pattern : Regex, group : Int) : String | Nil

Ruby: "ab"[/z/, 1] → nil (Crystal бросает NilAssertionError).

Source
byteslice(start : Int, count : Int) : String | Nil
Source
casecmp(other : String) : Int32

Ruby casecmp: сравнение ASCII-case-insensitive → -1/0/1.

Source
casecmp?(other : String) : Bool
Source
center(width : Int, pad : String) : String

padding-строкой (в Crystal — только Char).

Source
concat(other : String) : String

concat: в Ruby мутирует и возвращает self; строки Crystal неизменяемые, поэтому возвращаем новую строку с тем же значением.

Source
count(*sets : String) : Int32

Ruby String#count(*наборы): набор символов с диапазонами a-z и отрицанием ^; несколько аргументов — пересечение наборов.

Source
delete_prefix(prefix : String) : String
Source
delete_suffix(suffix : String) : String
Source
end_with?(*suffixes : String) : Bool
Source
end_with?(*suffixes : Char) : Bool
Source
getbyte(index : Int) : Int32 | Nil
Source
hex

Ruby String#hex: необязательный знак и 0x, стоп на первом нечётном.

Source
ljust(width : Int, pad : String) : String
Source
match?(other : Regex) : Bool

Ruby String#match? / =~ / slice(Range) / count(наборы) / start_with?(Regex).

Source
prepend(other : String) : String

prepend: как в Ruby (возвращаем новую строку — строки Crystal неизменяемые).

Source
rjust(width : Int, pad : String) : String
Source
setbyte(index : Int, byte : Int) : Nil
Source
slice(start : Int, count : Int) : String

String#slice(start, count) как в Ruby (в Crystal только byte_slice).

Source
slice(range : Range(Int, Int | Nil)) : String
Source
start_with?(pattern : Regex) : Bool

start_with? с регуляркой (матч в начале строки).

Source
start_with?(*prefixes : String) : Bool

Вариадические start_with?/end_with? (в Crystal — одиночный аргумент).

Source
start_with?(*prefixes : Char) : Bool
Source
swapcase

swapcase нет в Crystal.

Source

Ruby String#unpack / unpack1.

Source
unpack1(fmt : String) : Ruby::V4::PackValue | Nil
Source
upto(max : String, exclusive : Bool = false, &block : String -> _) : Nil

Ruby String#upto: итерация succ до max (exclusive — без последнего).

Source
upto(max : String, exclusive : Bool = false) : Array(String)
Source