String¶
A String is an ordered collection of bytes.
Strings don't specify an encoding.
Example usage of some common String methods:
actor Main
new create(env: Env) =>
try
// construct a new string
let str = "Hello"
// make an uppercased version
let str_upper = str.upper()
// make a reversed version
let str_reversed = str.reverse()
// add " world" to the end of our original string
let str_new = str.add(" world")
// count occurrences of letter "l"
let count = str_new.count("l")
// find first occurrence of letter "w"
let first_w = str_new.find("w") ?
// find first occurrence of letter "d"
let first_d = str_new.find("d") ?
// get substring capturing "world"
let substr = str_new.substring(first_w, first_d+1)
// clone substring
let substr_clone = substr.clone()
// print our substr
env.out.print(consume substr)
end
Implements¶
- Seq[U8 val] ref
- Comparable[String box] ref
- Stringable box
Constructors¶
create¶
An empty string. Enough space for len bytes is reserved.
Parameters¶
- len: USize val = 0
Returns¶
- String ref^
from_array¶
Create a string from an array, reusing the underlying data pointer.
Parameters¶
Returns¶
- String val^
from_iso_array¶
Create a string from an array, reusing the underlying data pointer
Parameters¶
Returns¶
- String iso^
from_cpointer¶
Return a string from binary pointer data without making a copy. This must be done only with C-FFI functions that return pony_alloc'd character arrays. If a null pointer is given then an empty string is returned.
new ref from_cpointer(
str: Pointer[U8 val] ref,
len: USize val,
alloc: USize val = 0)
: String ref^
Parameters¶
Returns¶
- String ref^
from_cstring¶
Return a string from a pointer to a null-terminated cstring without making a copy. The data is not copied. This must be done only with C-FFI functions that return pony_alloc'd character arrays. The pointer is scanned for the first null byte, which will be interpreted as the null terminator. Note that the scan is unbounded; the pointed to data must be null-terminated within the allocated array to preserve memory safety. If a null pointer is given then an empty string is returned.
Parameters¶
Returns¶
- String ref^
copy_cpointer¶
Create a string by copying a fixed number of bytes from a pointer.
Parameters¶
Returns¶
- String ref^
copy_cstring¶
Create a string by copying a null-terminated C string. Note that the scan is unbounded; the pointed to data must be null-terminated within the allocated array to preserve memory safety. If a null pointer is given then an empty string is returned.
Parameters¶
Returns¶
- String ref^
from_utf32¶
Create a UTF-8 string from a single UTF-32 code point.
Parameters¶
- value: U32 val
Returns¶
- String ref^
Public Functions¶
push_utf32¶
Push a UTF-32 code point.
Parameters¶
- value: U32 val
Returns¶
- None val
cpointer¶
Returns a C compatible pointer to the underlying string allocation.
Parameters¶
- offset: USize val = 0
Returns¶
cstring¶
Returns a C compatible pointer to a null-terminated version of the string, safe to pass to an FFI function that doesn't accept a size argument, expecting a null-terminator. If the underlying string is already null terminated, this is returned; otherwise the string is copied into a new, null-terminated allocation.
Returns¶
array¶
Returns an Array[U8] that reuses the underlying data pointer.
Returns¶
iso_array¶
Returns an Array[U8] iso that reuses the underlying data pointer.
Returns¶
size¶
Returns the length of the string data in bytes.
Returns¶
- USize val
codepoints¶
Returns the number of unicode code points in the string between the two
offsets. Index range [from
.. to
) is half-open.
Parameters¶
Returns¶
- USize val
space¶
Returns the space available for data, not including the null terminator.
Returns¶
- USize val
reserve¶
Reserve space for len bytes. An additional byte will be reserved for the null terminator.
Parameters¶
- len: USize val
Returns¶
- None val
compact¶
Try to remove unused space, making it available for garbage collection. The request may be ignored. The string is returned to allow call chaining.
Returns¶
- None val
recalc¶
Recalculates the string length. This is only needed if the string is changed via an FFI call. If a null terminator byte is not found within the allocated length, the size will not be changed.
Returns¶
- None val
truncate¶
Truncates the string at the minimum of len and space. Ensures there is a null terminator. Does not check for null terminators inside the string.
Note that memory is not freed by this operation.
Parameters¶
- len: USize val
Returns¶
- None val
trim_in_place¶
Trim the string to a portion of itself, covering from
until to
.
Unlike slice, the operation does not allocate a new string nor copy
elements.
Parameters¶
Returns¶
- None val
trim¶
Return a shared portion of this string, covering from
until to
.
Both the original and the new string are immutable, as they share memory.
The operation does not allocate a new string pointer nor copy elements.
Parameters¶
Returns¶
- String val
chop¶
Chops the string in half at the split point requested and returns both the left and right portions. The original string is trimmed in place and returned as the left portion. If the split point is larger than the string, the left portion is the original string and the right portion is a new empty string. Both strings are isolated and mutable, as they do not share memory. The operation does not allocate a new string pointer nor copy elements.
Parameters¶
- split_point: USize val
Returns¶
unchop¶
Unchops two iso strings to return the original string they were chopped from. Both input strings are isolated and mutable and were originally chopped from a single string. This function checks that they are indeed two strings chopped from the same original string and can be unchopped before doing the unchopping and returning the unchopped string. If the two strings cannot be unchopped it returns both strings without modifying them. The operation does not allocate a new string pointer nor copy elements.
Parameters¶
- b: String iso
Returns¶
is_null_terminated¶
Return true if the string is null-terminated and safe to pass to an FFI function that doesn't accept a size argument, expecting a null-terminator. This method checks that there is a null byte just after the final position of populated bytes in the string, but does not check for other null bytes which may be present earlier in the content of the string. If you need a null-terminated copy of this string, use the clone method.
Returns¶
- Bool val
utf32¶
Return a UTF32 representation of the character at the given offset and the number of bytes needed to encode that character. If the offset does not point to the beginning of a valid UTF8 encoding, return 0xFFFD (the unicode replacement character) and a length of one. Raise an error if the offset is out of bounds.
Parameters¶
- offset: ISize val
Returns¶
apply¶
Returns the i-th byte. Raise an error if the index is out of bounds.
Parameters¶
- i: USize val
Returns¶
- U8 val ?
update¶
Change the i-th byte. Raise an error if the index is out of bounds.
Parameters¶
Returns¶
- U8 val ?
at_offset¶
Returns the byte at the given offset. Raise an error if the offset is out of bounds.
Parameters¶
- offset: ISize val
Returns¶
- U8 val ?
update_offset¶
Changes a byte in the string, returning the previous byte at that offset. Raise an error if the offset is out of bounds.
Parameters¶
Returns¶
- U8 val ?
clone¶
Returns a copy of the string. The resulting string is null-terminated even if the original is not.
Returns¶
- String iso^
repeat_str¶
Returns a copy of the string repeated num
times with an optional
separator added inbetween repeats.
Parameters¶
Returns¶
- String iso^
mul¶
Returns a copy of the string repeated num
times.
Parameters¶
- num: USize val
Returns¶
- String iso^
find¶
Return the index of the n-th instance of s in the string starting from the beginning. Raise an error if there is no n-th occurrence of s or s is empty.
Parameters¶
Returns¶
- ISize val ?
rfind¶
Return the index of n-th instance of s
in the string starting from the
end. The offset
represents the highest index to included in the search.
Raise an error if there is no n-th occurrence of s
or s
is empty.
Parameters¶
Returns¶
- ISize val ?
contains¶
Returns true if contains s as a substring, false otherwise.
Parameters¶
Returns¶
- Bool val
count¶
Counts the non-overlapping occurrences of s in the string.
Parameters¶
Returns¶
- USize val
at¶
Returns true if the substring s is present at the given offset.
Parameters¶
Returns¶
- Bool val
delete¶
Delete len bytes at the supplied offset, compacting the string in place.
Parameters¶
Returns¶
- None val
substring¶
Returns a substring. Index range [from
.. to
) is half-open.
Returns an empty string if nothing is in the range.
Note that this operation allocates a new string to be returned. For
similar operations that don't allocate a new string, see trim
and
trim_in_place
.
Parameters¶
Returns¶
- String iso^
lower¶
Returns a lower case version of the string.
Returns¶
- String iso^
lower_in_place¶
Transforms the string to lower case. Currently only knows ASCII case.
Returns¶
- None val
upper¶
Returns an upper case version of the string. Currently only knows ASCII case.
Returns¶
- String iso^
upper_in_place¶
Transforms the string to upper case.
Returns¶
- None val
reverse¶
Returns a reversed version of the string.
Returns¶
- String iso^
reverse_in_place¶
Reverses the byte order in the string. This needs to be changed to handle UTF-8 correctly.
Returns¶
- None val
push¶
Add a byte to the end of the string.
Parameters¶
- value: U8 val
Returns¶
- None val
pop¶
Remove a byte from the end of the string.
Returns¶
- U8 val ?
unshift¶
Adds a byte to the beginning of the string.
Parameters¶
- value: U8 val
Returns¶
- None val
shift¶
Removes a byte from the beginning of the string.
Returns¶
- U8 val ?
append¶
Append the elements from a sequence, starting from the given offset.
Parameters¶
Returns¶
- None val
concat¶
Add len iterated bytes to the end of the string, starting from the given offset.
fun ref concat(
iter: Iterator[U8 val] ref,
offset: USize val = 0,
len: USize val = call)
: None val
Parameters¶
Returns¶
- None val
clear¶
Truncate the string to zero length.
Returns¶
- None val
insert¶
Returns a version of the string with the given string inserted at the given offset.
Parameters¶
Returns¶
- String iso^
insert_in_place¶
Inserts the given string at the given offset. Appends the string if the offset is out of bounds.
Parameters¶
Returns¶
- None val
insert_byte¶
Inserts a byte at the given offset. Appends if the offset is out of bounds.
Parameters¶
Returns¶
- None val
cut¶
Returns a version of the string with the given range deleted.
Index range [from
.. to
) is half-open.
Parameters¶
Returns¶
- String iso^
cut_in_place¶
Cuts the given range out of the string.
Index range [from
.. to
) is half-open.
Parameters¶
Returns¶
- None val
remove¶
Remove all instances of s from the string. Returns the count of removed instances.
Parameters¶
- s: String box
Returns¶
- USize val
replace¶
Replace up to n occurrences of from
in this
with to
. If n is 0, all
occurrences will be replaced. Returns the count of replaced occurrences.
Parameters¶
Returns¶
- USize val
split_by¶
Split the string into an array of strings that are delimited by delim
in
the original string. If n > 0
, then the split count is limited to n.
Example:
let original: String = "<b><span>Hello!</span></b>"
let delimiter: String = "><"
let split_array: Array[String] = original.split_by(delimiter)
env.out.print("OUTPUT:")
for value in split_array.values() do
env.out.print(value)
end
// OUTPUT:
// <b
// span>Hello!</span
// b>
Adjacent delimiters result in a zero length entry in the array. For
example, "1CutCut2".split_by("Cut") => ["1", "", "2"]
.
An empty delimiter results in an array that contains a single element equal to the whole string.
If you want to split the string with each individual character of delim
,
use split
.
Parameters¶
Returns¶
split¶
Split the string into an array of strings with any character in the
delimiter string. By default, the string is split with whitespace
characters. If n > 0
, then the split count is limited to n.
Example:
let original: String = "name,job;department"
let delimiter: String = ".,;"
let split_array: Array[String] = original.split(delimiter)
env.out.print("OUTPUT:")
for value in split_array.values() do
env.out.print(value)
end
// OUTPUT:
// name
// job
// department
Adjacent delimiters result in a zero length entry in the array. For
example, "1,,2".split(",") => ["1", "", "2"]
.
If you want to split the string with the entire delimiter string delim
,
use split_by
.
Parameters¶
Returns¶
strip¶
Remove all leading and trailing characters from the string that are in s.
Parameters¶
- s: String box = " "
Returns¶
- None val
rstrip¶
Remove all trailing characters within the string that are in s. By default, trailing whitespace is removed.
Parameters¶
- s: String box = " "
Returns¶
- None val
lstrip¶
Remove all leading characters within the string that are in s. By default, leading whitespace is removed.
Parameters¶
- s: String box = " "
Returns¶
- None val
add¶
Return a string that is a concatenation of this and that.
Parameters¶
- that: String box
Returns¶
- String iso^
join¶
Return a string that is a concatenation of the strings in data, using this as a separator.
Parameters¶
- data: Iterator[Stringable box] ref
Returns¶
- String iso^
compare¶
Lexically compare two strings.
Parameters¶
- that: String box
Returns¶
compare_sub¶
Lexically compare at most n
bytes of the substring of this
starting at
offset
with the substring of that
starting at that_offset
. The
comparison is case sensitive unless ignore_case
is true
.
If the substring of this
is a proper prefix of the substring of that
,
then this
is Less
than that
. Likewise, if that
is a proper prefix of
this
, then this
is Greater
than that
.
Both offset
and that_offset
can be negative, in which case the offsets
are computed from the end of the string.
If n + offset
is greater than the length of this
, or n + that_offset
is greater than the length of that
, then the number of positions compared
will be reduced to the length of the longest substring.
Needs to be made UTF-8 safe.
fun box compare_sub(
that: String box,
n: USize val,
offset: ISize val = 0,
that_offset: ISize val = 0,
ignore_case: Bool val = false)
: (Less val | Equal val | Greater val)
Parameters¶
- that: String box
- n: USize val
- offset: ISize val = 0
- that_offset: ISize val = 0
- ignore_case: Bool val = false
Returns¶
eq¶
Returns true if the two strings have the same contents.
Parameters¶
- that: String box
Returns¶
- Bool val
lt¶
Returns true if this is lexically less than that. Needs to be made UTF-8 safe.
Parameters¶
- that: String box
Returns¶
- Bool val
le¶
Returns true if this is lexically less than or equal to that. Needs to be made UTF-8 safe.
Parameters¶
- that: String box
Returns¶
- Bool val
offset_to_index¶
Parameters¶
- i: ISize val
Returns¶
- USize val
bool¶
Returns¶
- Bool val ?
i8¶
Parameters¶
- base: U8 val = 0
Returns¶
- I8 val ?
i16¶
Parameters¶
- base: U8 val = 0
Returns¶
- I16 val ?
i32¶
Parameters¶
- base: U8 val = 0
Returns¶
- I32 val ?
i64¶
Parameters¶
- base: U8 val = 0
Returns¶
- I64 val ?
i128¶
Parameters¶
- base: U8 val = 0
Returns¶
- I128 val ?
ilong¶
Parameters¶
- base: U8 val = 0
Returns¶
- ILong val ?
isize¶
Parameters¶
- base: U8 val = 0
Returns¶
- ISize val ?
u8¶
Parameters¶
- base: U8 val = 0
Returns¶
- U8 val ?
u16¶
Parameters¶
- base: U8 val = 0
Returns¶
- U16 val ?
u32¶
Parameters¶
- base: U8 val = 0
Returns¶
- U32 val ?
u64¶
Parameters¶
- base: U8 val = 0
Returns¶
- U64 val ?
u128¶
Parameters¶
- base: U8 val = 0
Returns¶
- U128 val ?
ulong¶
Parameters¶
- base: U8 val = 0
Returns¶
- ULong val ?
usize¶
Parameters¶
- base: U8 val = 0
Returns¶
- USize val ?
read_int[A: ((I8 val | I16 val | I32 val | I64 val | I128 val | ILong val | ISize val | U8 val | U16 val | U32 val | U64 val | U128 val | ULong val | USize val) & Integer[A] val)]¶
Read an integer from the specified location in this string. The integer value read and the number of bytes consumed are reported. The base parameter specifies the base to use, 0 indicates using the prefix, if any, to detect base 2, 10 or 16. If no integer is found at the specified location, then (0, 0) is returned, since no characters have been used. An integer out of range for the target type throws an error. A leading minus is allowed for signed integer types. Underscore characters are allowed throughout the integer and are ignored.
fun box read_int[A: ((I8 val | I16 val | I32 val |
I64 val | I128 val | ILong val |
ISize val | U8 val | U16 val |
U32 val | U64 val | U128 val |
ULong val | USize val) & Integer[A] val)](
offset: ISize val = 0,
base: U8 val = 0)
: (A , USize val) ?
Parameters¶
Returns¶
- (A , USize val) ?
f32¶
Convert this string starting at the given offset to a 32-bit floating point number (F32).
This method errors if this string cannot be parsed to a float, if the result would over- or underflow, the offset exceeds the size of this string or there are leftover characters in the string after conversion.
Examples:
Parameters¶
- offset: ISize val = 0
Returns¶
- F32 val ?
f64¶
Convert this string starting at the given offset to a 64-bit floating point number (F64).
This method errors if this string cannot be parsed to a float, if the result would over- or underflow, the offset exceeds the size of this string or there are leftover characters in the string after conversion.
Examples:
Parameters¶
- offset: ISize val = 0
Returns¶
- F64 val ?
hash¶
Returns¶
- USize val
hash64¶
Returns¶
- U64 val
string¶
Returns¶
- String iso^
values¶
Return an iterator over the bytes in the string.
Returns¶
- StringBytes ref^
runes¶
Return an iterator over the codepoints in the string.
Returns¶
- StringRunes ref^
ge¶
Parameters¶
- that: String box
Returns¶
- Bool val
gt¶
Parameters¶
- that: String box
Returns¶
- Bool val
ne¶
Parameters¶
- that: String box
Returns¶
- Bool val