Str Module (Strings)
Why This Matters
Most user-facing output and parsing logic is string-heavy. Str provides common operations without manual boilerplate.
Use Str (module object), not String (type name).
Import:
import std.string.*;
Core Operations
Str.len(s: String): IntegerStr.compare(a: String, b: String): IntegerStr.concat(a: String, b: String): StringStr.upper(s: String): StringStr.lower(s: String): StringStr.trim(s: String): StringStr.contains(s: String, sub: String): BooleanStr.startsWith(s: String, pre: String): BooleanStr.endsWith(s: String, suf: String): Boolean
Str.compare Contract (Read This First)
Str.compare(a, b) is an ordering function, not a boolean predicate.
- returns
< 0whenais ordered beforeb - returns
0whenaandbare equal - returns
> 0whenais ordered afterb
Correct usage patterns:
import std.io.*;
import std.string.*;
function main(): None {
a: String = "alpha";
b: String = "beta";
eq: Boolean = Str.compare(a, b) == 0;
lt: Boolean = Str.compare(a, b) < 0;
gt: Boolean = Str.compare(a, b) > 0;
println("eq={eq}, lt={lt}, gt={gt}");
return None;
}
Do not treat Str.compare(...) as Boolean.
String Workflow Pattern
A reliable default pipeline for user/input text:
trimincoming text- normalize (
lower/upper) if case-insensitive logic is needed - compare/search (
compare,contains,startsWith,endsWith) - format output via interpolation or
concat
Practical Example
import std.io.*;
import std.string.*;
function main(): None {
raw: String = " arden lang ";
clean: String = Str.trim(raw);
upper: String = Str.upper(clean);
has_lang: Boolean = Str.contains(clean, "lang");
println("clean={clean}");
println("upper={upper}");
println("has-lang={has_lang}");
return None;
}
Case-Insensitive Compare Pattern
import std.string.*;
function sameTag(a: String, b: String): Boolean {
return Str.compare(Str.lower(Str.trim(a)), Str.lower(Str.trim(b))) == 0;
}
Common Compare Anti-Pattern
Wrong mental model:
// wrong: compare does not return Boolean
// if (Str.compare(a, b)) { ... }
Right mental model:
import std.string.*;
function isEqual(a: String, b: String): Boolean {
if (Str.compare(a, b) == 0) {
return true;
}
return false;
}
to_string(...)
Global helper for scalar conversion to String.
function main(): None {
text: String = to_string(42);
return None;
}
Interpolation follows same scalar display model as to_string.
Performance/Readability Rule
If a transform chain gets long, name intermediate values:
- easier debugging (
printlneach stage) - easier review (clear intent per step)
- fewer accidental compare/trim/case-order bugs
Common Mistakes
- confusing
Stringtype withStrmodule - chaining many string transforms without intermediate naming/debug points
- forgetting normalization (
trim/lower) before comparisons - assuming
Str.compareis boolean (it returns an integer relation)