class String
Ein String-Objekt enthält eine beliebige Byte-Sequenz, die typischerweise Text oder Binärdaten darstellt. Ein String-Objekt kann mit String::new oder als Literale erstellt werden.
String-Objekte unterscheiden sich von Symbol-Objekten dadurch, dass Symbol-Objekte als Bezeichner und nicht als Text oder Daten gedacht sind.
Sie können ein String-Objekt explizit erstellen mit
-
Einem String-Literal.
-
Einem Heredoc-Literal.
Sie können bestimmte Objekte mit folgenden Mitteln in Strings konvertieren
-
Methode
String.
Einige String-Methoden modifizieren self. Typischerweise modifiziert eine Methode, deren Name mit ! endet, self und gibt self zurück; oft gibt eine gleichnamige Methode (ohne das !) einen neuen String zurück.
Im Allgemeinen, wenn sowohl Bang- als auch Nicht-Bang-Versionen einer Methode existieren, mutiert die Bang-Methode und die Nicht-Bang-Methode tut dies nicht. Eine Methode ohne Bang kann jedoch auch mutieren, wie z.B. String#replace.
Substitutionsmethoden
Diese Methoden führen Substitutionen durch
-
String#sub: Eine Substitution (oder keine); gibt einen neuen String zurück. -
String#sub!: Eine Substitution (oder keine); gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
String#gsub: Null oder mehr Substitutionen; gibt einen neuen String zurück. -
String#gsub!: Null oder mehr Substitutionen; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil.
Jede dieser Methoden nimmt
-
Ein erstes Argument,
pattern(StringoderRegexp), das die zu ersetzenden Teilstrings angibt. -
Eines der folgenden
Die Beispiele in diesem Abschnitt verwenden meist die Methoden String#sub und String#gsub; die hier illustrierten Prinzipien gelten für alle vier Substitutionsmethoden.
Argument pattern
Das Argument pattern ist üblicherweise ein regulärer Ausdruck
s = 'hello' s.sub(/[aeiou]/, '*') # => "h*llo" s.gsub(/[aeiou]/, '*') # => "h*ll*" s.gsub(/[aeiou]/, '') # => "hll" s.sub(/ell/, 'al') # => "halo" s.gsub(/xyzzy/, '*') # => "hello" 'THX1138'.gsub(/\d+/, '00') # => "THX00"
Wenn pattern ein String ist, werden alle seine Zeichen als normale Zeichen behandelt (nicht als Regexp-Sonderzeichen)
'THX1138'.gsub('\d+', '00') # => "THX1138"
String replacement
Wenn replacement ein String ist, bestimmt dieser String den ersetzenden String, der für den übereinstimmenden Text substituiert wird.
Jedes der obigen Beispiele verwendet einen einfachen String als ersetzenden String.
String replacement kann Rückverweise auf die Erfassungen des Musters enthalten
-
\n(n ist eine nicht-negative ganze Zahl) bezieht sich auf$n. -
\k<name>bezieht sich auf die benannte Erfassungname.
Siehe Regexp für Details.
Beachten Sie, dass innerhalb des Strings replacement eine Zeichenkombination wie $& als normaler Text behandelt wird, nicht als spezielle Match-Variable. Sie können jedoch einige spezielle Match-Variablen unter Verwendung dieser Kombinationen referenzieren
-
\&und\0entsprechen$&, das den vollständigen übereinstimmenden Text enthält. -
\'entspricht$', das den String nach der Übereinstimmung enthält. -
\`entspricht$`, das den String vor der Übereinstimmung enthält. -
\+entspricht$+, das die letzte Erfassungsgruppe enthält.
Siehe Regexp für Details.
Beachten Sie, dass \\ als Escape interpretiert wird, d.h. ein einzelner Backslash.
Beachten Sie auch, dass ein String-Literal Backslashes verbraucht. Siehe String Literals für Details zu String-Literalen.
Ein Rückverweis wird typischerweise von einem zusätzlichen Backslash eingeleitet. Wenn Sie zum Beispiel einen Rückverweis \& in replacement mit einem doppelt zitierten String-Literal schreiben möchten, müssen Sie "..\\&.." schreiben.
Wenn Sie einen Nicht-Rückverweis-String \& in replacement schreiben möchten, müssen Sie zuerst den Backslash escapen, um zu verhindern, dass diese Methode ihn als Rückverweis interpretiert, und dann müssen Sie die Backslashes erneut escapen, um zu verhindern, dass ein String-Literal sie verbraucht: "..\\\\&..".
Sie möchten vielleicht die Blockform verwenden, um übermäßige Backslashes zu vermeiden.
Hash replacement
Wenn das Argument replacement ein Hash ist und pattern mit einem seiner Schlüssel übereinstimmt, ist der ersetzende String der Wert für diesen Schlüssel
h = {'foo' => 'bar', 'baz' => 'bat'} 'food'.sub('foo', h) # => "bard"
Beachten Sie, dass ein Symbol-Schlüssel nicht übereinstimmt
h = {foo: 'bar', baz: 'bat'} 'food'.sub('foo', h) # => "d"
Block
In der Blockform wird der aktuelle Übereinstimmungsstring an den Block übergeben; der Rückgabewert des Blocks wird zum ersetzenden String
s = '@' '1234'.gsub(/\d/) { |match| s.succ! } # => "ABCD"
Spezielle Match-Variablen wie $1, $2, $`, $& und $' werden entsprechend gesetzt.
Leerzeichen in Strings
In der Klasse String wird Whitespace als eine zusammenhängende Sequenz von Zeichen definiert, die aus einer beliebigen Mischung der folgenden besteht
-
NL (Null):
"\x00","\u0000". -
HT (horizontales Tabulatorzeichen):
"\x09","\t". -
LF (Zeilenvorschub):
"\x0a","\n". -
VT (vertikales Tabulatorzeichen):
"\x0b","\v". -
FF (Seitenvorschub):
"\x0c","\f". -
CR (Wagenrücklauf):
"\x0d","\r". -
SP (Leerzeichen):
"\x20"," ".
Whitespace ist für die folgenden Methoden relevant
Was gibt es hier
Zuerst, was ist anderswo. Klasse String
-
Erbt von der Object-Klasse.
-
Enthält das Comparable-Modul.
Hier bietet die Klasse String Methoden, die nützlich sind für
Erstellen eines Strings
-
::new: Gibt einen neuen String zurück. -
::try_convert: Gibt einen neuen String zurück, der aus einem gegebenen Objekt erstellt wurde.
Einfrieren/Entfrieren
-
+@: Gibt einen String zurück, der nicht eingefroren ist:self, wenn nicht eingefroren; andernfallsself.dup. -
-@(alias:dedup): Gibt einen String zurück, der eingefroren ist:self, wenn bereits eingefroren; andernfallsself.freeze. -
freeze: Friertselfein, wenn es nicht bereits eingefroren ist; gibtselfzurück.
Abfragen
Zählungen
-
bytesize: Gibt die Anzahl der Bytes zurück. -
count: Gibt die Anzahl der Teilstrings zurück, die mit den gegebenen Strings übereinstimmen. -
empty?: Gibt zurück, ob die Länge vonselfnull ist. -
length(alias:size): Gibt die Anzahl der Zeichen zurück (nicht Bytes).
Teilstrings
-
=~: Gibt den Index des ersten Teilstrings zurück, der einem gegebenenRegexpoder einem anderen Objekt entspricht; gibtnilzurück, wenn keine Übereinstimmung gefunden wird. -
byteindex: Gibt den Byte-Index des ersten Vorkommens eines gegebenen Teilstrings zurück. -
byterindex: Gibt den Byte-Index des letzten Vorkommens eines gegebenen Teilstrings zurück. -
index: Gibt den Index des ersten Vorkommens eines gegebenen Teilstrings zurück; gibtnilzurück, wenn keines gefunden wird. -
rindex: Gibt den Index des letzten Vorkommens eines gegebenen Teilstrings zurück; gibtnilzurück, wenn keines gefunden wird. -
include?: Gibttruezurück, wenn der String einen gegebenen Teilstring enthält; andernfallsfalse. -
match: Gibt einMatchData-Objekt zurück, wenn der String einem gegebenenRegexpentspricht; andernfallsnil. -
match?: Gibttruezurück, wenn der String einem gegebenenRegexpentspricht; andernfallsfalse. -
start_with?: Gibttruezurück, wenn der String mit einem der gegebenen Teilstrings beginnt. -
end_with?: Gibttruezurück, wenn der String mit einem der gegebenen Teilstrings endet.
Kodierungen
-
encoding: Gibt dasEncoding-Objekt zurück, das die Kodierung des Strings darstellt. -
unicode_normalized?: Gibttruezurück, wenn der String in normalisierter Unicode-Form vorliegt; andernfallsfalse. -
valid_encoding?: Gibttruezurück, wenn der String nur Zeichen enthält, die für seine Kodierung gültig sind. -
ascii_only?: Gibttruezurück, wenn der String nur ASCII-Zeichen enthält; andernfallsfalse.
Sonstiges
-
sum: Gibt eine einfache Prüfsumme für den String zurück: die Summe jedes Bytes. -
hash: Gibt den ganzzahligen Hash-Code zurück.
Vergleichen
-
==(alias:===): Gibttruezurück, wenn ein gegebener anderer String den gleichen Inhalt wieselfhat. -
eql?: Gibttruezurück, wenn der Inhalt mit dem gegebenen anderen String identisch ist. -
<=>: Gibt -1, 0 oder 1 zurück, je nachdem, ob ein gegebener anderer String kleiner, gleich oder größer alsselfist. -
casecmp: Ignoriert Groß-/Kleinschreibung und gibt -1, 0 oder 1 zurück, je nachdem, obselfkleiner, gleich oder größer als ein gegebener anderer String ist. -
casecmp?: Ignoriert Groß-/Kleinschreibung und gibt zurück, ob ein gegebener anderer String mitselfidentisch ist.
Modifizieren
Jede dieser Methoden modifiziert self.
Einfügen
-
insert: Gibtselfzurück, wobei ein gegebener String an einem bestimmten Offset eingefügt wird. -
<<: Gibtself, verkettet mit einem gegebenen String oder einer Ganzzahl, zurück. -
append_as_bytes: Gibtselfverkettet mit Strings zurück, ohne eine Kodierungsvalidierung oder -konvertierung durchzuführen. -
prepend: Stellt der Verkettung von gegebenen anderen Stringsselfvoran.
Substitution
-
bytesplice: Ersetzt Bytes vonselfdurch Bytes aus einem gegebenen String; gibtselfzurück. -
sub!: Ersetzt den ersten Teilstring, der mit einem gegebenen Muster übereinstimmt, durch einen gegebenen Ersatzstring; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
gsub!: Ersetzt jeden Teilstring, der mit einem gegebenen Muster übereinstimmt, durch einen gegebenen Ersatzstring; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
succ!(alias:next!): Gibtselfzurück, modifiziert, um sein eigener Nachfolger zu werden. -
replace: Gibtselfzurück, wobei sein gesamter Inhalt durch einen gegebenen String ersetzt wird. -
reverse!: Gibtselfzurück, wobei seine Zeichen in umgekehrter Reihenfolge angeordnet sind. -
setbyte: Setzt das Byte an einem gegebenen ganzzahligen Offset auf einen gegebenen Wert; gibt das Argument zurück. -
tr!: Ersetzt angegebene Zeichen inselfdurch angegebene Ersatzzeichen; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
tr_s!: Ersetzt angegebene Zeichen inselfdurch angegebene Ersatzzeichen und entfernt Duplikate aus den modifizierten Teilstrings; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil.
Groß-/Kleinschreibung
-
capitalize!: Großschreibt das erste Zeichen und kleinschreibt alle anderen; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
downcase!: Kleinschreibt alle Zeichen; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
upcase!: Großschreibt alle Zeichen; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
swapcase!: Großschreibt jedes klein geschriebene Zeichen und kleinschreibt jedes groß geschriebene Zeichen; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil.
Encoding
-
encode!: Gibtselfzurück, wobei alle Zeichen von einer Kodierung in eine andere transkodiert werden. -
unicode_normalize!: Normalisiertselfnach Unicode; gibtselfzurück. -
scrub!: Ersetzt jedes ungültige Byte durch ein gegebenes Zeichen; gibtselfzurück. -
force_encoding: Ändert die Kodierung in eine gegebene Kodierung; gibtselfzurück.
Löschen
-
clear: Entfernt den gesamten Inhalt, sodassselfleer ist; gibtselfzurück. -
slice!,[]=: Entfernt einen Teilstring, der durch einen gegebenen Index, Start/Länge, Bereich, Regexp oder Teilstring bestimmt wird. -
squeeze!: Entfernt zusammenhängende doppelte Zeichen; gibtselfzurück. -
delete!: Entfernt Zeichen, die durch den Schnittpunkt von Teilstring-Argumenten bestimmt werden. -
delete_prefix!: Entfernt das führende Präfix; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
delete_suffix!: Entfernt das nachfolgende Suffix; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
lstrip!: Entfernt führende Leerzeichen; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
rstrip!: Entfernt nachfolgende Leerzeichen; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
strip!: Entfernt führende und nachfolgende Leerzeichen; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
chomp!: Entfernt den nachfolgenden Record-Separator, falls vorhanden; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil. -
chop!: Entfernt nachfolgende Zeilenumbruchzeichen, falls vorhanden; andernfalls entfernt es das letzte Zeichen; gibtselfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil.
Konvertierung zu neuem String
Jede dieser Methoden gibt einen neuen String zurück, der auf self basiert, oft nur eine modifizierte Kopie von self.
Extension
-
*: Gibt die Verkettung mehrerer Kopien vonselfzurück. -
+: Gibt die Verkettung vonselfund einem gegebenen anderen String zurück. -
center: Gibt eine Kopie vonselfzurück, zentriert mit angegebener Auffüllung. -
concat: Gibt die Verkettung vonselfmit gegebenen anderen Strings zurück. -
ljust: Gibt eine Kopie vonselfeiner gegebenen Länge zurück, rechts aufgefüllt mit einem gegebenen anderen String. -
rjust: Gibt eine Kopie vonselfeiner gegebenen Länge zurück, links aufgefüllt mit einem gegebenen anderen String.
Encoding
-
b: Gibt eine Kopie vonselfmit ASCII-8BIT-Kodierung zurück. -
scrub: Gibt eine Kopie vonselfzurück, bei der jedes ungültige Byte durch ein gegebenes Zeichen ersetzt wird. -
unicode_normalize: Gibt eine Kopie vonselfzurück, bei der jedes Zeichen nach Unicode normalisiert ist. -
encode: Gibt eine Kopie vonselfzurück, bei der alle Zeichen von einer Kodierung in eine andere transkodiert werden.
Substitution
-
dump: Gibt eine druckbare Darstellung vonselfzurück, eingeschlossen in doppelte Anführungszeichen. -
undump: Umkehrung vondump; gibt eine Kopie vonselfzurück, mit Änderungen der Art, wie sie vondumpvorgenommen wurden, "rückgängig gemacht". -
sub: Gibt eine Kopie vonselfzurück, bei der der erste Teilstring, der mit einem gegebenen Muster übereinstimmt, durch einen gegebenen Ersatzstring ersetzt wird. -
gsub: Gibt eine Kopie vonselfzurück, bei der jeder Teilstring, der mit einem gegebenen Muster übereinstimmt, durch einen gegebenen Ersatzstring ersetzt wird. -
succ(alias:next): Gibt den String zurück, der der Nachfolger vonselfist. -
reverse: Gibt eine Kopie vonselfzurück, mit seinen Zeichen in umgekehrter Reihenfolge. -
tr: Gibt eine Kopie vonselfzurück, bei der angegebene Zeichen durch angegebene Ersatzzeichen ersetzt werden. -
tr_s: Gibt eine Kopie vonselfzurück, bei der angegebene Zeichen durch angegebene Ersatzzeichen ersetzt werden, wobei Duplikate aus den modifizierten Teilstrings entfernt werden. -
%: Gibt den String zurück, der sich aus der Formatierung eines gegebenen Objekts inselfergibt.
Groß-/Kleinschreibung
-
capitalize: Gibt eine Kopie vonselfzurück, bei der das erste Zeichen großgeschrieben und alle anderen Zeichen kleingeschrieben sind. -
downcase: Gibt eine Kopie vonselfzurück, bei der alle Zeichen kleingeschrieben sind. -
upcase: Gibt eine Kopie vonselfzurück, bei der alle Zeichen großgeschrieben sind. -
swapcase: Gibt eine Kopie vonselfzurück, bei der alle großgeschriebenen Zeichen kleingeschrieben und alle kleingeschriebenen Zeichen großgeschrieben sind.
Löschen
-
delete: Gibt eine Kopie vonselfzurück, bei der Zeichen entfernt wurden. -
delete_prefix: Gibt eine Kopie vonselfzurück, bei der ein gegebenes Präfix entfernt wurde. -
delete_suffix: Gibt eine Kopie vonselfzurück, bei der ein gegebenes Suffix entfernt wurde. -
lstrip: Gibt eine Kopie vonselfzurück, bei der führende Leerzeichen entfernt wurden. -
rstrip: Gibt eine Kopie vonselfzurück, bei der nachfolgende Leerzeichen entfernt wurden. -
strip: Gibt eine Kopie vonselfzurück, bei der führende und nachfolgende Leerzeichen entfernt wurden. -
chomp: Gibt eine Kopie vonselfzurück, bei der ein nachfolgender Record-Separator, falls vorhanden, entfernt wurde. -
chop: Gibt eine Kopie vonselfzurück, bei der nachfolgende Zeilenumbruchzeichen oder das letzte Zeichen entfernt wurden. -
squeeze: Gibt eine Kopie vonselfzurück, bei der zusammenhängende doppelte Zeichen entfernt wurden. -
[](alias:slice): Gibt einen Teilstring zurück, der durch einen gegebenen Index, Start/Länge, Bereich, Regexp oder String bestimmt wird. -
byteslice: Gibt einen Teilstring zurück, der durch einen gegebenen Index, Start/Länge oder Bereich bestimmt wird. -
chr: Gibt das erste Zeichen zurück.
Duplizierung
-
to_s(alias:to_str): Wennselfeine Unterklasse vonStringist, gibt es eine Kopie vonselfin einemStringzurück; andernfalls gibt esselfzurück.
Konvertierung zu Nicht-String
Jede dieser Methoden konvertiert den Inhalt von self in einen Nicht-String.
Zeichen, Bytes und Cluster
-
bytes: Gibt ein Array der Bytes inselfzurück. -
chars: Gibt ein Array der Zeichen inselfzurück. -
codepoints: Gibt ein Array der ganzzahligen Ordnungszahlen inselfzurück. -
getbyte: Gibt das ganzzahlige Byte am gegebenen Index inselfzurück. -
grapheme_clusters: Gibt ein Array der Graphemcluster inselfzurück.
Aufteilen
-
lines: Gibt ein Array der Zeilen inselfzurück, bestimmt durch einen gegebenen Record-Separator. -
partition: Gibt ein 3-elementiges Array zurück, das durch den ersten Teilstring bestimmt wird, der mit einem gegebenen Teilstring oder Regexp übereinstimmt. -
rpartition: Gibt ein 3-elementiges Array zurück, das durch den letzten Teilstring bestimmt wird, der mit einem gegebenen Teilstring oder Regexp übereinstimmt. -
split: Gibt ein Array von Teilstrings zurück, bestimmt durch einen gegebenen Trenner – Regexp oder String – oder, wenn ein Block gegeben ist, übergibt diese Teilstrings an den Block.
Abgleichen
-
scan: Gibt ein Array von Teilstrings zurück, die mit einem gegebenen Regexp oder String übereinstimmen, oder, wenn ein Block gegeben ist, übergibt jeden übereinstimmenden Teilstring an den Block. -
unpack: Gibt ein Array von Teilstrings zurück, die ausselfgemäß einem gegebenen Format extrahiert wurden. -
unpack1: Gibt den ersten Teilstring zurück, der ausselfgemäß einem gegebenen Format extrahiert wurde.
Numerisch
-
hex: Gibt den ganzzahligen Wert der führenden Zeichen zurück, interpretiert als Hexadezimalziffern. -
oct: Gibt den ganzzahligen Wert der führenden Zeichen zurück, interpretiert als Oktalziffern. -
ord: Gibt die ganzzahlige Ordnungszahl des ersten Zeichens inselfzurück. -
to_c: Gibt den komplexen Wert der führenden Zeichen zurück, interpretiert als komplexe Zahl. -
to_i: Gibt den ganzzahligen Wert der führenden Zeichen zurück, interpretiert als ganze Zahl. -
to_f: Gibt den Gleitkommawert der führenden Zeichen zurück, interpretiert als Gleitkommazahl. -
to_r: Gibt den rationalen Wert der führenden Zeichen zurück, interpretiert als rational.
Strings und Symbole
-
inspect: Gibt eine Kopie vonselfzurück, eingeschlossen in doppelte Anführungszeichen, mit escapeten Sonderzeichen. -
intern(alias:to_sym): Gibt das Symbol zurück, dasselfentspricht.
Iterieren
-
each_byte: Ruft den gegebenen Block mit jedem aufeinanderfolgenden Byte inselfauf. -
each_char: Ruft den gegebenen Block mit jedem aufeinanderfolgenden Zeichen inselfauf. -
each_codepoint: Ruft den gegebenen Block mit jedem aufeinanderfolgenden ganzzahligen Codepoint inselfauf. -
each_grapheme_cluster: Ruft den gegebenen Block mit jedem aufeinanderfolgenden Graphemcluster inselfauf. -
each_line: Ruft den gegebenen Block mit jeder aufeinanderfolgenden Zeile inselfauf, bestimmt durch einen gegebenen Record-Separator. -
upto: Ruft den gegebenen Block mit jedem String-Wert auf, der durch aufeinanderfolgende Aufrufe vonsucczurückgegeben wird.
Öffentliche Klassenmethoden
Source
# File ext/json/lib/json/add/string.rb, line 11 def self.json_create(object) object["raw"].pack("C*") end
Source
static VALUE
rb_str_init(int argc, VALUE *argv, VALUE str)
{
static ID keyword_ids[2];
VALUE orig, opt, venc, vcapa;
VALUE kwargs[2];
rb_encoding *enc = 0;
int n;
if (!keyword_ids[0]) {
keyword_ids[0] = rb_id_encoding();
CONST_ID(keyword_ids[1], "capacity");
}
n = rb_scan_args(argc, argv, "01:", &orig, &opt);
if (!NIL_P(opt)) {
rb_get_kwargs(opt, keyword_ids, 0, 2, kwargs);
venc = kwargs[0];
vcapa = kwargs[1];
if (!UNDEF_P(venc) && !NIL_P(venc)) {
enc = rb_to_encoding(venc);
}
if (!UNDEF_P(vcapa) && !NIL_P(vcapa)) {
long capa = NUM2LONG(vcapa);
long len = 0;
int termlen = enc ? rb_enc_mbminlen(enc) : 1;
if (capa < STR_BUF_MIN_SIZE) {
capa = STR_BUF_MIN_SIZE;
}
if (n == 1) {
StringValue(orig);
len = RSTRING_LEN(orig);
if (capa < len) {
capa = len;
}
if (orig == str) n = 0;
}
str_modifiable(str);
if (STR_EMBED_P(str) || FL_TEST(str, STR_SHARED|STR_NOFREE)) {
/* make noembed always */
const size_t size = (size_t)capa + termlen;
const char *const old_ptr = RSTRING_PTR(str);
const size_t osize = RSTRING_LEN(str) + TERM_LEN(str);
char *new_ptr = ALLOC_N(char, size);
if (STR_EMBED_P(str)) RUBY_ASSERT((long)osize <= str_embed_capa(str));
memcpy(new_ptr, old_ptr, osize < size ? osize : size);
FL_UNSET_RAW(str, STR_SHARED|STR_NOFREE);
RSTRING(str)->as.heap.ptr = new_ptr;
}
else if (STR_HEAP_SIZE(str) != (size_t)capa + termlen) {
SIZED_REALLOC_N(RSTRING(str)->as.heap.ptr, char,
(size_t)capa + termlen, STR_HEAP_SIZE(str));
}
STR_SET_LEN(str, len);
TERM_FILL(&RSTRING(str)->as.heap.ptr[len], termlen);
if (n == 1) {
memcpy(RSTRING(str)->as.heap.ptr, RSTRING_PTR(orig), len);
rb_enc_cr_str_exact_copy(str, orig);
}
FL_SET(str, STR_NOEMBED);
RSTRING(str)->as.heap.aux.capa = capa;
}
else if (n == 1) {
rb_str_replace(str, orig);
}
if (enc) {
rb_enc_associate(str, enc);
ENC_CODERANGE_CLEAR(str);
}
}
else if (n == 1) {
rb_str_replace(str, orig);
}
return str;
}
Gibt ein neues String-Objekt zurück, das den gegebenen string enthält.
Die options sind optionale Schlüsselwortoptionen (siehe unten).
Ohne Argument und ohne Angabe des Schlüsselworts encoding wird ein leerer String mit der Encoding ASCII-8BIT zurückgegeben.
s = String.new # => "" s.encoding # => #<Encoding:ASCII-8BIT>
Mit dem Argument string und ohne Angabe der Schlüsselwortoption encoding wird ein neuer String mit der gleichen Kodierung wie string zurückgegeben.
s0 = 'foo'.encode(Encoding::UTF_16) s1 = String.new(s0) s1.encoding # => #<Encoding:UTF-16 (dummy)>
(Im Gegensatz zu String.new hat ein String-Literal wie '' oder ein Heredoc-Literal immer die Skript-Kodierung.)
Mit der Schlüsselwortoption encoding wird ein String mit der angegebenen Kodierung zurückgegeben; die encoding kann ein Encoding-Objekt, ein Kodierungsname oder ein Kodierungsnamensalias sein.
String.new(encoding: Encoding::US_ASCII).encoding # => #<Encoding:US-ASCII> String.new('', encoding: Encoding::US_ASCII).encoding # => #<Encoding:US-ASCII> String.new('foo', encoding: Encoding::US_ASCII).encoding # => #<Encoding:US-ASCII> String.new('foo', encoding: 'US-ASCII').encoding # => #<Encoding:US-ASCII> String.new('foo', encoding: 'ASCII').encoding # => #<Encoding:US-ASCII>
Die angegebene Kodierung muss nicht für den Inhalt des Strings gültig sein, und ihre Gültigkeit wird nicht überprüft.
s = String.new('こんにちは', encoding: 'ascii') s.valid_encoding? # => false
Aber die angegebene encoding selbst wird überprüft.
String.new('foo', encoding: 'bar') # Raises ArgumentError.
Mit der Schlüsselwortoption capacity ist der gegebene Wert nur ein Hinweis und legt möglicherweise die Größe des internen Puffers fest oder auch nicht, was wiederum die Leistung beeinflussen kann.
String.new('foo', capacity: 1) # Buffer size is at least 4 (includes terminal null byte). String.new('foo', capacity: 4096) # Buffer size is at least 4; # may be equal to, greater than, or less than 4096.
Source
static VALUE
rb_str_s_try_convert(VALUE dummy, VALUE str)
{
return rb_check_string_type(str);
}
Versucht, das gegebene object in einen String zu konvertieren.
Wenn object bereits ein String ist, gibt object unverändert zurück.
Andernfalls, wenn object auf :to_str reagiert, wird object.to_str aufgerufen und das Ergebnis zurückgegeben.
Gibt nil zurück, wenn object nicht auf :to_str reagiert.
Löst eine Ausnahme aus, es sei denn, object.to_str gibt einen String zurück.
Öffentliche Instanzmethoden
Source
static VALUE
rb_str_format_m(VALUE str, VALUE arg)
{
VALUE tmp = rb_check_array_type(arg);
if (!NIL_P(tmp)) {
return rb_str_format(RARRAY_LENINT(tmp), RARRAY_CONST_PTR(tmp), str);
}
return rb_str_format(1, &arg, str);
}
Gibt das Ergebnis der Formatierung von object in die Formatangaben zurück, die in self enthalten sind (siehe Format Specifications).
'%05d' % 123 # => "00123"
Wenn self mehrere Formatangaben enthält, muss object ein Array oder ein Hash sein, der die zu formatierenden Objekte enthält.
'%-5s: %016x' % [ 'ID', self.object_id ] # => "ID : 00002b054ec93168" 'foo = %{foo}' % {foo: 'bar'} # => "foo = bar" 'foo = %{foo}, baz = %{baz}' % {foo: 'bar', baz: 'bat'} # => "foo = bar, baz = bat"
Verwandt: siehe Konvertierung zu neuem String.
Source
VALUE
rb_str_times(VALUE str, VALUE times)
{
VALUE str2;
long n, len;
char *ptr2;
int termlen;
if (times == INT2FIX(1)) {
return str_duplicate(rb_cString, str);
}
if (times == INT2FIX(0)) {
str2 = str_alloc_embed(rb_cString, 0);
rb_enc_copy(str2, str);
return str2;
}
len = NUM2LONG(times);
if (len < 0) {
rb_raise(rb_eArgError, "negative argument");
}
if (RSTRING_LEN(str) == 1 && RSTRING_PTR(str)[0] == 0) {
if (STR_EMBEDDABLE_P(len, 1)) {
str2 = str_alloc_embed(rb_cString, len + 1);
memset(RSTRING_PTR(str2), 0, len + 1);
}
else {
str2 = str_alloc_heap(rb_cString);
RSTRING(str2)->as.heap.aux.capa = len;
RSTRING(str2)->as.heap.ptr = ZALLOC_N(char, (size_t)len + 1);
}
STR_SET_LEN(str2, len);
rb_enc_copy(str2, str);
return str2;
}
if (len && LONG_MAX/len < RSTRING_LEN(str)) {
rb_raise(rb_eArgError, "argument too big");
}
len *= RSTRING_LEN(str);
termlen = TERM_LEN(str);
str2 = str_enc_new(rb_cString, 0, len, STR_ENC_GET(str));
ptr2 = RSTRING_PTR(str2);
if (len) {
n = RSTRING_LEN(str);
memcpy(ptr2, RSTRING_PTR(str), n);
while (n <= len/2) {
memcpy(ptr2 + n, ptr2, n);
n *= 2;
}
memcpy(ptr2 + n, ptr2, len-n);
}
STR_SET_LEN(str2, len);
TERM_FILL(&ptr2[len], termlen);
rb_enc_cr_str_copy_for_substr(str2, str);
return str2;
}
Gibt einen neuen String zurück, der n Kopien von self enthält.
'Ho!' * 3 # => "Ho!Ho!Ho!" 'No!' * 0 # => ""
Verwandt: siehe Konvertierung zu neuem String.
Source
VALUE
rb_str_plus(VALUE str1, VALUE str2)
{
VALUE str3;
rb_encoding *enc;
char *ptr1, *ptr2, *ptr3;
long len1, len2;
int termlen;
StringValue(str2);
enc = rb_enc_check_str(str1, str2);
RSTRING_GETMEM(str1, ptr1, len1);
RSTRING_GETMEM(str2, ptr2, len2);
termlen = rb_enc_mbminlen(enc);
if (len1 > LONG_MAX - len2) {
rb_raise(rb_eArgError, "string size too big");
}
str3 = str_enc_new(rb_cString, 0, len1+len2, enc);
ptr3 = RSTRING_PTR(str3);
memcpy(ptr3, ptr1, len1);
memcpy(ptr3+len1, ptr2, len2);
TERM_FILL(&ptr3[len1+len2], termlen);
ENCODING_CODERANGE_SET(str3, rb_enc_to_index(enc),
ENC_CODERANGE_AND(ENC_CODERANGE(str1), ENC_CODERANGE(str2)));
RB_GC_GUARD(str1);
RB_GC_GUARD(str2);
return str3;
}
Gibt einen neuen String zurück, der other_string an self angehängt enthält.
'Hello from ' + self.to_s # => "Hello from main"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
str_uplus(VALUE str)
{
if (OBJ_FROZEN(str) || CHILLED_STRING_P(str)) {
return rb_str_dup(str);
}
else {
return str;
}
}
Gibt self zurück, wenn self nicht eingefroren ist und ohne Warnung modifiziert werden kann.
Andernfalls wird self.dup zurückgegeben, das nicht eingefroren ist.
Verwandt: siehe Einfrieren/Entfrieren.
Source
static VALUE
str_uminus(VALUE str)
{
if (!BARE_STRING_P(str) && !rb_obj_frozen_p(str)) {
str = rb_str_dup(str);
}
return rb_fstring(str);
}
Gibt einen eingefrorenen String zurück, der mit self identisch ist.
Der zurückgegebene String ist self, wenn und nur wenn alle folgenden Bedingungen erfüllt sind
-
selfist bereits eingefroren. -
selfist eine Instanz von String (nicht von einer Unterklasse von String) -
selfhat keine Instanzvariablen gesetzt.
Andernfalls ist der zurückgegebene String eine eingefrorene Kopie von self.
Das Zurückgeben von self, wann immer möglich, vermeidet das Duplizieren von self; siehe Data deduplication.
Es kann auch das Duplizieren anderer, bereits vorhandener Strings vermeiden.
s0 = 'foo' s1 = 'foo' s0.object_id == s1.object_id # => false (-s0).object_id == (-s1).object_id # => true
Beachten Sie, dass die Methode -@ praktisch für die Definition einer Konstante ist.
FileName = -'config/database.yml'
Während ihr Alias dedup besser zum Verketten geeignet ist.
'foo'.dedup.gsub!('o')
Verwandt: siehe Einfrieren/Entfrieren.
Source
VALUE
rb_str_concat(VALUE str1, VALUE str2)
{
unsigned int code;
rb_encoding *enc = STR_ENC_GET(str1);
int encidx;
if (RB_INTEGER_TYPE_P(str2)) {
if (rb_num_to_uint(str2, &code) == 0) {
}
else if (FIXNUM_P(str2)) {
rb_raise(rb_eRangeError, "%ld out of char range", FIX2LONG(str2));
}
else {
rb_raise(rb_eRangeError, "bignum out of char range");
}
}
else {
return rb_str_append(str1, str2);
}
encidx = rb_ascii8bit_appendable_encoding_index(enc, code);
if (encidx >= 0) {
rb_str_buf_cat_byte(str1, (unsigned char)code);
}
else {
long pos = RSTRING_LEN(str1);
int cr = ENC_CODERANGE(str1);
int len;
char *buf;
switch (len = rb_enc_codelen(code, enc)) {
case ONIGERR_INVALID_CODE_POINT_VALUE:
rb_raise(rb_eRangeError, "invalid codepoint 0x%X in %s", code, rb_enc_name(enc));
break;
case ONIGERR_TOO_BIG_WIDE_CHAR_VALUE:
case 0:
rb_raise(rb_eRangeError, "%u out of char range", code);
break;
}
buf = ALLOCA_N(char, len + 1);
rb_enc_mbcput(code, buf, enc);
if (rb_enc_precise_mbclen(buf, buf + len + 1, enc) != len) {
rb_raise(rb_eRangeError, "invalid codepoint 0x%X in %s", code, rb_enc_name(enc));
}
rb_str_resize(str1, pos+len);
memcpy(RSTRING_PTR(str1) + pos, buf, len);
if (cr == ENC_CODERANGE_7BIT && code > 127) {
cr = ENC_CODERANGE_VALID;
}
else if (cr == ENC_CODERANGE_BROKEN) {
cr = ENC_CODERANGE_UNKNOWN;
}
ENC_CODERANGE_SET(str1, cr);
}
return str1;
}
Hängt eine String-Repräsentation von object an self an; gibt self zurück.
Wenn object ein String ist, wird er an self angehängt.
s = 'foo' s << 'bar' # => "foobar" s # => "foobar"
Wenn object eine Ganzzahl ist, wird sein Wert als Codepoint betrachtet; der Wert wird in ein Zeichen umgewandelt, bevor er verkettet wird.
s = 'foo' s << 33 # => "foo!"
Zusätzlich, wenn der Codepoint im Bereich 0..0xff liegt und die Kodierung von self Encoding::US_ASCII ist, wird die Kodierung zu Encoding::ASCII_8BIT geändert.
s = 'foo'.encode(Encoding::US_ASCII) s.encoding # => #<Encoding:US-ASCII> s << 0xff # => "foo\xFF" s.encoding # => #<Encoding:BINARY (ASCII-8BIT)>
Löst RangeError aus, wenn dieser Codepoint nicht in der Kodierung von self darstellbar ist.
s = 'foo' s.encoding # => <Encoding:UTF-8> s << 0x00110000 # 1114112 out of char range (RangeError) s = 'foo'.encode(Encoding::EUC_JP) s << 0x00800080 # invalid codepoint 0x800080 in EUC-JP (RangeError)
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_cmp_m(VALUE str1, VALUE str2)
{
int result;
VALUE s = rb_check_string_type(str2);
if (NIL_P(s)) {
return rb_invcmp(str1, str2);
}
result = rb_str_cmp(str1, s);
return INT2FIX(result);
}
Vergleicht self und other, indem deren Inhalte und nicht deren Längen ausgewertet werden.
Gibt zurück
-
-1, wennselfkleiner ist. -
0, wenn die beiden gleich sind. -
1, wennselfgrößer ist. -
nil, wenn die beiden nicht vergleichbar sind.
Beispiele
'a' <=> 'b' # => -1 'a' <=> 'ab' # => -1 'a' <=> 'a' # => 0 'b' <=> 'a' # => 1 'ab' <=> 'a' # => 1 'a' <=> :a # => nil
Die Klasse String enthält das Modul Comparable, dessen Methoden alle String#<=> zum Vergleichen verwenden.
Verwandt: siehe Vergleichen.
Source
VALUE
rb_str_equal(VALUE str1, VALUE str2)
{
if (str1 == str2) return Qtrue;
if (!RB_TYPE_P(str2, T_STRING)) {
if (!rb_respond_to(str2, idTo_str)) {
return Qfalse;
}
return rb_equal(str2, str1);
}
return rb_str_eql_internal(str1, str2);
}
Gibt zurück, ob object gleich self ist.
Wenn object ein String ist, wird zurückgegeben, ob object die gleiche Länge und denselben Inhalt wie self hat.
s = 'foo' s == 'foo' # => true s == 'food' # => false s == 'FOO' # => false
Gibt false zurück, wenn die Kodierungen der beiden Strings nicht kompatibel sind.
"\u{e4 f6 fc}".encode(Encoding::ISO_8859_1) == ("\u{c4 d6 dc}") # => false
Wenn object kein String ist
-
Wenn
objectdie Methodeto_strunterstützt, wirdobject == selfaufgerufen und dessen Rückgabewert zurückgegeben. -
Wenn
objectto_strnicht unterstützt, wirdfalsezurückgegeben.
Verwandt: Vergleichen.
Source
static VALUE
rb_str_match(VALUE x, VALUE y)
{
switch (OBJ_BUILTIN_TYPE(y)) {
case T_STRING:
rb_raise(rb_eTypeError, "type mismatch: String given");
case T_REGEXP:
return rb_reg_match(y, x);
default:
return rb_funcall(y, idEqTilde, 1, x);
}
}
Wenn object ein Regexp ist, gibt den Index des ersten von object gefundenen Teilstrings in self zurück oder nil, wenn keine Übereinstimmung gefunden wird; aktualisiert Regexp-bezogene globale Variablen.
'foo' =~ /f/ # => 0 $~ # => #<MatchData "f"> 'foo' =~ /o/ # => 1 $~ # => #<MatchData "o"> 'foo' =~ /x/ # => nil $~ # => nil
Beachten Sie, dass string =~ regexp sich von regexp =~ string unterscheidet (siehe Regexp#=~).
number = nil 'no. 9' =~ /(?<number>\d+)/ # => 4 number # => nil # Not assigned. /(?<number>\d+)/ =~ 'no. 9' # => 4 number # => "9" # Assigned.
Wenn object kein Regexp ist, wird der Rückgabewert von object =~ self zurückgegeben.
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_aref_m(int argc, VALUE *argv, VALUE str)
{
if (argc == 2) {
if (RB_TYPE_P(argv[0], T_REGEXP)) {
return rb_str_subpat(str, argv[0], argv[1]);
}
else {
return rb_str_substr_two_fixnums(str, argv[0], argv[1], TRUE);
}
}
rb_check_arity(argc, 1, 2);
return rb_str_aref(str, argv[0]);
}
Gibt den durch die Argumente angegebenen Teilstring von self zurück.
Form self[index]
Mit einem nicht-negativen ganzzahligen Argument index wird der 1-Zeichen-Teilstring in self an der Zeichenposition index zurückgegeben.
'hello'[0] # => "h" 'hello'[4] # => "o" 'hello'[5] # => nil 'Привет'[2] # => "и" 'こんにちは'[4] # => "は"
Mit einem negativen ganzzahligen Argument index wird vom Ende von self rückwärts gezählt.
'hello'[-1] # => "o" 'hello'[-5] # => "h" 'hello'[-6] # => nil
Form self[start, length]
Mit den ganzzahligen Argumenten start und length wird ein Teilstring der Größe length Zeichen (sofern verfügbar) beginnend bei der durch start angegebenen Zeichenposition zurückgegeben.
Wenn das Argument start nicht-negativ ist, ist der Offset start.
'hello'[0, 1] # => "h" 'hello'[0, 5] # => "hello" 'hello'[0, 6] # => "hello" 'hello'[2, 3] # => "llo" 'hello'[2, 0] # => "" 'hello'[2, -1] # => nil
Wenn das Argument start negativ ist, wird vom Ende von self rückwärts gezählt.
'hello'[-1, 1] # => "o" 'hello'[-5, 5] # => "hello" 'hello'[-1, 0] # => "" 'hello'[-6, 5] # => nil
Sonderfall: Wenn start gleich der Länge von self ist, wird ein neuer leerer String zurückgegeben.
'hello'[5, 3] # => ""
Form self[range]
Mit einem Range-Argument range wird der Teilstring self[range.start, range.size] gebildet.
'hello'[0..2] # => "hel" 'hello'[0, 3] # => "hel" 'hello'[0...2] # => "he" 'hello'[0, 2] # => "he" 'hello'[0, 0] # => "" 'hello'[0...0] # => ""
Form self[regexp, capture = 0]
Mit einem Regexp-Argument regexp und capture gleich Null wird nach einem übereinstimmenden Teilstring in self gesucht; aktualisiert Regexp-bezogene globale Variablen.
'hello'[/ell/] # => "ell" 'hello'[/l+/] # => "ll" 'hello'[//] # => "" 'hello'[/nosuch/] # => nil
Wenn capture eine positive ganze Zahl n ist, wird die +n+-te übereinstimmende Gruppe zurückgegeben.
'hello'[/(h)(e)(l+)(o)/] # => "hello" 'hello'[/(h)(e)(l+)(o)/, 1] # => "h" $1 # => "h" 'hello'[/(h)(e)(l+)(o)/, 2] # => "e" $2 # => "e" 'hello'[/(h)(e)(l+)(o)/, 3] # => "ll" 'hello'[/(h)(e)(l+)(o)/, 4] # => "o" 'hello'[/(h)(e)(l+)(o)/, 5] # => nil
Form self[substring]
Mit einem String-Argument substring wird der übereinstimmende Teilstring von self zurückgegeben, falls gefunden.
'hello'['ell'] # => "ell" 'hello'[''] # => "" 'hello'['nosuch'] # => nil 'Привет'['ив'] # => "ив" 'こんにちは'['んにち'] # => "んにち"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_aset_m(int argc, VALUE *argv, VALUE str)
{
if (argc == 3) {
if (RB_TYPE_P(argv[0], T_REGEXP)) {
rb_str_subpat_set(str, argv[0], argv[1], argv[2]);
}
else {
rb_str_update(str, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
}
return argv[2];
}
rb_check_arity(argc, 2, 3);
return rb_str_aset(str, argv[0], argv[1]);
}
Gibt self mit allen, einem Teilstring oder keinem seiner Inhalte ersetzt zurück; gibt das Argument other_string zurück.
Form self[index] = other_string
Mit einem nicht-negativen ganzzahligen Argument index wird nach dem 1-Zeichen-Teilstring gesucht, der in self an der Zeichenposition index gefunden wird.
s = 'hello' s[0] = 'foo' # => "foo" s # => "fooello" s = 'hello' s[4] = 'foo' # => "foo" s # => "hellfoo" s = 'hello' s[5] = 'foo' # => "foo" s # => "hellofoo" s = 'hello' s[6] = 'foo' # Raises IndexError: index 6 out of string.
Mit einem negativen ganzzahligen Argument index wird vom Ende von self rückwärts gezählt.
s = 'hello' s[-1] = 'foo' # => "foo" s # => "hellfoo" s = 'hello' s[-5] = 'foo' # => "foo" s # => "fooello" s = 'hello' s[-6] = 'foo' # Raises IndexError: index -6 out of string.
Form self[start, length] = other_string
Mit den ganzzahligen Argumenten start und length wird nach einem Teilstring der Größe length Zeichen (sofern verfügbar) beginnend bei der durch start angegebenen Zeichenposition gesucht.
Wenn das Argument start nicht-negativ ist, ist der Offset start.
s = 'hello' s[0, 1] = 'foo' # => "foo" s # => "fooello" s = 'hello' s[0, 5] = 'foo' # => "foo" s # => "foo" s = 'hello' s[0, 9] = 'foo' # => "foo" s # => "foo" s = 'hello' s[2, 0] = 'foo' # => "foo" s # => "hefoollo" s = 'hello' s[2, -1] = 'foo' # Raises IndexError: negative length -1.
Wenn das Argument start negativ ist, wird vom Ende von self rückwärts gezählt.
s = 'hello' s[-1, 1] = 'foo' # => "foo" s # => "hellfoo" s = 'hello' s[-1, 9] = 'foo' # => "foo" s # => "hellfoo" s = 'hello' s[-5, 2] = 'foo' # => "foo" s # => "foollo" s = 'hello' s[-3, 0] = 'foo' # => "foo" s # => "hefoollo" s = 'hello' s[-6, 2] = 'foo' # Raises IndexError: index -6 out of string.
Sonderfall: Wenn start gleich der Länge von self ist, wird das Argument an self angehängt.
s = 'hello' s[5, 3] = 'foo' # => "foo" s # => "hellofoo"
Form self[range] = other_string
Mit einem Range-Argument range ist dies äquivalent zu self[range.start, range.size] = other_string.
s0 = 'hello' s1 = 'hello' s0[0..2] = 'foo' # => "foo" s1[0, 3] = 'foo' # => "foo" s0 # => "foolo" s1 # => "foolo" s = 'hello' s[0...2] = 'foo' # => "foo" s # => "foollo" s = 'hello' s[0...0] = 'foo' # => "foo" s # => "foohello" s = 'hello' s[9..10] = 'foo' # Raises RangeError: 9..10 out of range
Form self[regexp, capture = 0] = other_string
Mit einem Regexp-Argument regexp und capture gleich Null wird nach einem übereinstimmenden Teilstring in self gesucht; aktualisiert Regexp-bezogene globale Variablen.
s = 'hello' s[/l/] = 'L' # => "L" [$`, $&, $'] # => ["he", "l", "lo"] s[/eLlo/] = 'owdy' # => "owdy" [$`, $&, $'] # => ["h", "eLlo", ""] s[/eLlo/] = 'owdy' # Raises IndexError: regexp not matched. [$`, $&, $'] # => [nil, nil, nil]
Wenn capture eine positive ganze Zahl n ist, wird nach der +n+-ten übereinstimmenden Gruppe gesucht.
s = 'hello' s[/(h)(e)(l+)(o)/] = 'foo' # => "foo" [$`, $&, $'] # => ["", "hello", ""] s = 'hello' s[/(h)(e)(l+)(o)/, 1] = 'foo' # => "foo" s # => "fooello" [$`, $&, $'] # => ["", "hello", ""] s = 'hello' s[/(h)(e)(l+)(o)/, 2] = 'foo' # => "foo" s # => "hfoollo" [$`, $&, $'] # => ["", "hello", ""] s = 'hello' s[/(h)(e)(l+)(o)/, 4] = 'foo' # => "foo" s # => "hellfoo" [$`, $&, $'] # => ["", "hello", ""] s = 'hello' # => "hello" s[/(h)(e)(l+)(o)/, 5] = 'foo # Raises IndexError: index 5 out of regexp. s = 'hello' s[/nosuch/] = 'foo' # Raises IndexError: regexp not matched.
Form self[substring] = other_string
Mit einem String-Argument substring
s = 'hello' s['l'] = 'foo' # => "foo" s # => "hefoolo" s = 'hello' s['ll'] = 'foo' # => "foo" s # => "hefooo" s = 'Привет' s['ив'] = 'foo' # => "foo" s # => "Прfooет" s = 'こんにちは' s['んにち'] = 'foo' # => "foo" s # => "こfooは" s['nosuch'] = 'foo' # Raises IndexError: string not matched.
Verwandt: siehe Modifizieren.
Source
VALUE
rb_str_append_as_bytes(int argc, VALUE *argv, VALUE str)
{
long needed_capacity = 0;
volatile VALUE t0;
enum ruby_value_type *types = ALLOCV_N(enum ruby_value_type, t0, argc);
for (int index = 0; index < argc; index++) {
VALUE obj = argv[index];
enum ruby_value_type type = types[index] = rb_type(obj);
switch (type) {
case T_FIXNUM:
case T_BIGNUM:
needed_capacity++;
break;
case T_STRING:
needed_capacity += RSTRING_LEN(obj);
break;
default:
rb_raise(
rb_eTypeError,
"wrong argument type %"PRIsVALUE" (expected String or Integer)",
rb_obj_class(obj)
);
break;
}
}
str_ensure_available_capa(str, needed_capacity);
char *sptr = RSTRING_END(str);
for (int index = 0; index < argc; index++) {
VALUE obj = argv[index];
enum ruby_value_type type = types[index];
switch (type) {
case T_FIXNUM:
case T_BIGNUM: {
argv[index] = obj = rb_int_and(obj, INT2FIX(0xff));
char byte = (char)(NUM2INT(obj) & 0xFF);
*sptr = byte;
sptr++;
break;
}
case T_STRING: {
const char *ptr;
long len;
RSTRING_GETMEM(obj, ptr, len);
memcpy(sptr, ptr, len);
sptr += len;
break;
}
default:
rb_bug("append_as_bytes arguments should have been validated");
}
}
STR_SET_LEN(str, RSTRING_LEN(str) + needed_capacity);
TERM_FILL(sptr, TERM_LEN(str)); /* sentinel */
int cr = ENC_CODERANGE(str);
switch (cr) {
case ENC_CODERANGE_7BIT: {
for (int index = 0; index < argc; index++) {
VALUE obj = argv[index];
enum ruby_value_type type = types[index];
switch (type) {
case T_FIXNUM:
case T_BIGNUM: {
if (!ISASCII(NUM2INT(obj))) {
goto clear_cr;
}
break;
}
case T_STRING: {
if (ENC_CODERANGE(obj) != ENC_CODERANGE_7BIT) {
goto clear_cr;
}
break;
}
default:
rb_bug("append_as_bytes arguments should have been validated");
}
}
break;
}
case ENC_CODERANGE_VALID:
if (ENCODING_GET_INLINED(str) == ENCINDEX_ASCII_8BIT) {
goto keep_cr;
}
else {
goto clear_cr;
}
break;
default:
goto clear_cr;
break;
}
RB_GC_GUARD(t0);
clear_cr:
// If no fast path was hit, we clear the coderange.
// append_as_bytes is predominantly meant to be used in
// buffering situation, hence it's likely the coderange
// will never be scanned, so it's not worth spending time
// precomputing the coderange except for simple and common
// situations.
ENC_CODERANGE_CLEAR(str);
keep_cr:
return str;
}
Verkettet jedes Objekt in objects an self; gibt self zurück; führt keine Kodierungsüberprüfung oder -konvertierung durch.
s = 'foo' s.append_as_bytes(" \xE2\x82") # => "foo \xE2\x82" s.valid_encoding? # => false s.append_as_bytes("\xAC 12") s.valid_encoding? # => true
Wenn ein gegebenes Objekt eine ganze Zahl ist, wird der Wert als 8-Bit-Byte betrachtet; wenn die ganze Zahl mehr als ein Byte belegt (d.h. größer als 255 ist), wird nur das niederwertige Byte angehängt (ähnlich wie bei String#setbyte).
s = "" s.append_as_bytes(0, 257) # => "\u0000\u0001" s.bytesize # => 2
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_is_ascii_only_p(VALUE str)
{
int cr = rb_enc_str_coderange(str);
return RBOOL(cr == ENC_CODERANGE_7BIT);
}
Gibt zurück, ob self nur ASCII-Zeichen enthält.
'abc'.ascii_only? # => true "abc\u{6666}".ascii_only? # => false
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_b(VALUE str)
{
VALUE str2;
if (STR_EMBED_P(str)) {
str2 = str_alloc_embed(rb_cString, RSTRING_LEN(str) + TERM_LEN(str));
}
else {
str2 = str_alloc_heap(rb_cString);
}
str_replace_shared_without_enc(str2, str);
if (rb_enc_asciicompat(STR_ENC_GET(str))) {
// BINARY strings can never be broken; they're either 7-bit ASCII or VALID.
// If we know the receiver's code range then we know the result's code range.
int cr = ENC_CODERANGE(str);
switch (cr) {
case ENC_CODERANGE_7BIT:
ENC_CODERANGE_SET(str2, ENC_CODERANGE_7BIT);
break;
case ENC_CODERANGE_BROKEN:
case ENC_CODERANGE_VALID:
ENC_CODERANGE_SET(str2, ENC_CODERANGE_VALID);
break;
default:
ENC_CODERANGE_CLEAR(str2);
break;
}
}
return str2;
}
Gibt eine Kopie von self zurück, die die Kodierung ASCII-8BIT hat; die zugrunde liegenden Bytes werden nicht geändert.
s = "\x99" s.encoding # => #<Encoding:UTF-8> t = s.b # => "\x99" t.encoding # => #<Encoding:ASCII-8BIT> s = "\u4095" # => "䂕" s.encoding # => #<Encoding:UTF-8> s.bytes # => [228, 130, 149] t = s.b # => "\xE4\x82\x95" t.encoding # => #<Encoding:ASCII-8BIT> t.bytes # => [228, 130, 149]
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_byteindex_m(int argc, VALUE *argv, VALUE str)
{
VALUE sub;
VALUE initpos;
long pos;
if (rb_scan_args(argc, argv, "11", &sub, &initpos) == 2) {
long slen = RSTRING_LEN(str);
pos = NUM2LONG(initpos);
if (pos < 0 ? (pos += slen) < 0 : pos > slen) {
if (RB_TYPE_P(sub, T_REGEXP)) {
rb_backref_set(Qnil);
}
return Qnil;
}
}
else {
pos = 0;
}
str_ensure_byte_pos(str, pos);
if (RB_TYPE_P(sub, T_REGEXP)) {
if (rb_reg_search(sub, str, pos, 0) >= 0) {
VALUE match = rb_backref_get();
struct re_registers *regs = RMATCH_REGS(match);
pos = BEG(0);
return LONG2NUM(pos);
}
}
else {
StringValue(sub);
pos = rb_str_byteindex(str, sub, pos);
if (pos >= 0) return LONG2NUM(pos);
}
return Qnil;
}
Gibt den 0-basierten ganzzahligen Index eines Teilstrings von self zurück, der durch object (ein String oder Regexp) und offset angegeben ist, oder nil, wenn kein solcher Teilstring existiert; der zurückgegebene Index ist die Anzahl der Bytes (nicht Zeichen).
Wenn object ein String ist, wird der Index des ersten gefundenen Teilstrings zurückgegeben, der gleich object ist.
s = 'foo' # => "foo" s.size # => 3 # Three 1-byte characters. s.bytesize # => 3 # Three bytes. s.byteindex('f') # => 0 s.byteindex('o') # => 1 s.byteindex('oo') # => 1 s.byteindex('ooo') # => nil
Wenn object ein Regexp ist, wird der Index des ersten gefundenen Teilstrings zurückgegeben, der mit object übereinstimmt; aktualisiert Regexp-bezogene globale Variablen.
s = 'foo' s.byteindex(/f/) # => 0 $~ # => #<MatchData "f"> s.byteindex(/o/) # => 1 s.byteindex(/oo/) # => 1 s.byteindex(/ooo/) # => nil $~ # => nil
Das ganzzahlige Argument offset gibt, wenn es gegeben ist, den 0-basierten Index des Bytes an, ab dem die Suche beginnen soll.
Wenn offset nicht-negativ ist, beginnt die Suche bei Byte-Position offset.
s = 'foo' s.byteindex('o', 1) # => 1 s.byteindex('o', 2) # => 2 s.byteindex('o', 3) # => nil
Wenn offset negativ ist, wird vom Ende von self rückwärts gezählt.
s = 'foo' s.byteindex('o', -1) # => 2 s.byteindex('o', -2) # => 1 s.byteindex('o', -3) # => 1 s.byteindex('o', -4) # => nil
Löst eine IndexError aus, wenn das Byte bei offset nicht das erste Byte eines Zeichens ist.
s = "\uFFFF\uFFFF" # => "\uFFFF\uFFFF" s.size # => 2 # Two 3-byte characters. s.bytesize # => 6 # Six bytes. s.byteindex("\uFFFF") # => 0 s.byteindex("\uFFFF", 1) # Raises IndexError s.byteindex("\uFFFF", 2) # Raises IndexError s.byteindex("\uFFFF", 3) # => 3 s.byteindex("\uFFFF", 4) # Raises IndexError s.byteindex("\uFFFF", 5) # Raises IndexError s.byteindex("\uFFFF", 6) # => nil
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_byterindex_m(int argc, VALUE *argv, VALUE str)
{
VALUE sub;
VALUE initpos;
long pos, len = RSTRING_LEN(str);
if (rb_scan_args(argc, argv, "11", &sub, &initpos) == 2) {
pos = NUM2LONG(initpos);
if (pos < 0 && (pos += len) < 0) {
if (RB_TYPE_P(sub, T_REGEXP)) {
rb_backref_set(Qnil);
}
return Qnil;
}
if (pos > len) pos = len;
}
else {
pos = len;
}
str_ensure_byte_pos(str, pos);
if (RB_TYPE_P(sub, T_REGEXP)) {
if (rb_reg_search(sub, str, pos, 1) >= 0) {
VALUE match = rb_backref_get();
struct re_registers *regs = RMATCH_REGS(match);
pos = BEG(0);
return LONG2NUM(pos);
}
}
else {
StringValue(sub);
pos = rb_str_byterindex(str, sub, pos);
if (pos >= 0) return LONG2NUM(pos);
}
return Qnil;
}
Gibt den 0-basierten ganzzahligen Index eines Teilstrings von self zurück, der die *letzte* Übereinstimmung für das gegebene object (ein String oder Regexp) und offset ist, oder nil, wenn kein solcher Teilstring existiert; der zurückgegebene Index ist die Anzahl der Bytes (nicht Zeichen).
Wenn object ein String ist, wird der Index des *letzten* gefundenen Teilstrings zurückgegeben, der gleich object ist.
s = 'foo' # => "foo" s.size # => 3 # Three 1-byte characters. s.bytesize # => 3 # Three bytes. s.byterindex('f') # => 0 s.byterindex('o') # => 2 s.byterindex('oo') # => 1 s.byterindex('ooo') # => nil
Wenn object ein Regexp ist, wird der Index des letzten gefundenen Teilstrings zurückgegeben, der mit object übereinstimmt; aktualisiert Regexp-bezogene globale Variablen.
s = 'foo' s.byterindex(/f/) # => 0 $~ # => #<MatchData "f"> s.byterindex(/o/) # => 2 s.byterindex(/oo/) # => 1 s.byterindex(/ooo/) # => nil $~ # => nil
Die letzte Übereinstimmung bedeutet, dass die Suche an der möglicherweise letzten Position beginnt, nicht die letzte der längsten Übereinstimmungen.
s = 'foo' s.byterindex(/o+/) # => 2 $~ #=> #<MatchData "o">
Um die letzte längste Übereinstimmung zu erhalten, verwenden Sie eine negative Lookbehind-Assertion.
s = 'foo' s.byterindex(/(?<!o)o+/) # => 1 $~ # => #<MatchData "oo">
Oder verwenden Sie die Methode byteindex mit einer negativen Lookahead-Assertion.
s = 'foo' s.byteindex(/o+(?!.*o)/) # => 1 $~ #=> #<MatchData "oo">
Das ganzzahlige Argument offset gibt, wenn es gegeben ist, den 0-basierten Index des Bytes an, an dem die Suche enden soll.
Wenn offset nicht-negativ ist, endet die Suche bei Byte-Position offset.
s = 'foo' s.byterindex('o', 0) # => nil s.byterindex('o', 1) # => 1 s.byterindex('o', 2) # => 2 s.byterindex('o', 3) # => 2
Wenn offset negativ ist, wird vom Ende von self rückwärts gezählt.
s = 'foo' s.byterindex('o', -1) # => 2 s.byterindex('o', -2) # => 1 s.byterindex('o', -3) # => nil
Löst eine IndexError aus, wenn das Byte bei offset nicht das erste Byte eines Zeichens ist.
s = "\uFFFF\uFFFF" # => "\uFFFF\uFFFF" s.size # => 2 # Two 3-byte characters. s.bytesize # => 6 # Six bytes. s.byterindex("\uFFFF") # => 3 s.byterindex("\uFFFF", 1) # Raises IndexError s.byterindex("\uFFFF", 2) # Raises IndexError s.byterindex("\uFFFF", 3) # => 3 s.byterindex("\uFFFF", 4) # Raises IndexError s.byterindex("\uFFFF", 5) # Raises IndexError s.byterindex("\uFFFF", 6) # => nil
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_bytes(VALUE str)
{
VALUE ary = WANTARRAY("bytes", RSTRING_LEN(str));
return rb_str_enumerate_bytes(str, ary);
}
Gibt ein Array der Bytes in self zurück.
'hello'.bytes # => [104, 101, 108, 108, 111] 'Привет'.bytes # => [208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130] 'こんにちは'.bytes # => [227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175]
Verwandt: siehe Konvertierung in Nicht-String.
Source
VALUE
rb_str_bytesize(VALUE str)
{
return LONG2NUM(RSTRING_LEN(str));
}
Source
static VALUE
rb_str_byteslice(int argc, VALUE *argv, VALUE str)
{
if (argc == 2) {
long beg = NUM2LONG(argv[0]);
long len = NUM2LONG(argv[1]);
return str_byte_substr(str, beg, len, TRUE);
}
rb_check_arity(argc, 1, 2);
return str_byte_aref(str, argv[0]);
}
Gibt einen Teilstring von self zurück oder nil, wenn der Teilstring nicht konstruiert werden kann.
Mit den ganzzahligen Argumenten offset und length wird der Teilstring beginnend bei dem angegebenen offset und mit der angegebenen length (sofern verfügbar) zurückgegeben.
s = '0123456789' # => "0123456789" s.byteslice(2) # => "2" s.byteslice(200) # => nil s.byteslice(4, 3) # => "456" s.byteslice(4, 30) # => "456789"
Gibt nil zurück, wenn length negativ ist oder offset außerhalb von self liegt.
s.byteslice(4, -1) # => nil s.byteslice(40, 2) # => nil
Zählt vom Ende von self rückwärts, wenn offset negativ ist.
s = '0123456789' # => "0123456789" s.byteslice(-4) # => "6" s.byteslice(-4, 3) # => "678"
Mit einem Range-Argument range wird byteslice(range.begin, range.size) zurückgegeben.
s = '0123456789' # => "0123456789" s.byteslice(4..6) # => "456" s.byteslice(-6..-4) # => "456" s.byteslice(5..2) # => "" # range.size is zero. s.byteslice(40..42) # => nil
Die Start- und End-Offsets müssen nicht an Zeichengrenzen liegen.
s = 'こんにちは' s.byteslice(0, 3) # => "こ" s.byteslice(1, 3) # => "\x81\x93\xE3"
Die Kodierungen von self und dem zurückgegebenen Teilstring sind immer gleich.
s.encoding # => #<Encoding:UTF-8> s.byteslice(0, 3).encoding # => #<Encoding:UTF-8> s.byteslice(1, 3).encoding # => #<Encoding:UTF-8>
Aber je nach Zeichengrenzen ist die Kodierung des zurückgegebenen Teilstrings möglicherweise nicht gültig.
s.valid_encoding? # => true s.byteslice(0, 3).valid_encoding? # => true s.byteslice(1, 3).valid_encoding? # => false
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_bytesplice(int argc, VALUE *argv, VALUE str)
{
long beg, len, vbeg, vlen;
VALUE val;
int cr;
rb_check_arity(argc, 2, 5);
if (!(argc == 2 || argc == 3 || argc == 5)) {
rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 2, 3, or 5)", argc);
}
if (argc == 2 || (argc == 3 && !RB_INTEGER_TYPE_P(argv[0]))) {
if (!rb_range_beg_len(argv[0], &beg, &len, RSTRING_LEN(str), 2)) {
rb_raise(rb_eTypeError, "wrong argument type %s (expected Range)",
rb_builtin_class_name(argv[0]));
}
val = argv[1];
StringValue(val);
if (argc == 2) {
/* bytesplice(range, str) */
vbeg = 0;
vlen = RSTRING_LEN(val);
}
else {
/* bytesplice(range, str, str_range) */
if (!rb_range_beg_len(argv[2], &vbeg, &vlen, RSTRING_LEN(val), 2)) {
rb_raise(rb_eTypeError, "wrong argument type %s (expected Range)",
rb_builtin_class_name(argv[2]));
}
}
}
else {
beg = NUM2LONG(argv[0]);
len = NUM2LONG(argv[1]);
val = argv[2];
StringValue(val);
if (argc == 3) {
/* bytesplice(index, length, str) */
vbeg = 0;
vlen = RSTRING_LEN(val);
}
else {
/* bytesplice(index, length, str, str_index, str_length) */
vbeg = NUM2LONG(argv[3]);
vlen = NUM2LONG(argv[4]);
}
}
str_check_beg_len(str, &beg, &len);
str_check_beg_len(val, &vbeg, &vlen);
str_modify_keep_cr(str);
if (RB_UNLIKELY(ENCODING_GET_INLINED(str) != ENCODING_GET_INLINED(val))) {
rb_enc_associate(str, rb_enc_check(str, val));
}
rb_str_update_1(str, beg, len, val, vbeg, vlen);
cr = ENC_CODERANGE_AND(ENC_CODERANGE(str), ENC_CODERANGE(val));
if (cr != ENC_CODERANGE_BROKEN)
ENC_CODERANGE_SET(str, cr);
return str;
}
Ersetzt *Ziel-Bytes* in self durch *Quell-Bytes* aus dem gegebenen String str; gibt self zurück.
In der ersten Form bestimmen die Argumente offset und length die Ziel-Bytes, und die Quell-Bytes sind alle aus dem gegebenen str.
'0123456789'.bytesplice(0, 3, 'abc') # => "abc3456789" '0123456789'.bytesplice(3, 3, 'abc') # => "012abc6789" '0123456789'.bytesplice(0, 50, 'abc') # => "abc" '0123456789'.bytesplice(50, 3, 'abc') # Raises IndexError.
Die Anzahl der Ziel-Bytes und Quell-Bytes kann unterschiedlich sein.
'0123456789'.bytesplice(0, 6, 'abc') # => "abc6789" # Shorter source. '0123456789'.bytesplice(0, 1, 'abc') # => "abc123456789" # Shorter target.
Und jede Anzahl kann Null sein (d.h. einen leeren String angeben).
'0123456789'.bytesplice(0, 3, '') # => "3456789" # Empty source. '0123456789'.bytesplice(0, 0, 'abc') # => "abc0123456789" # Empty target.
In der zweiten Form, genau wie in der ersten, bestimmen die Argumente offset und length die Ziel-Bytes; das Argument str *enthält* die Quell-Bytes, und die zusätzlichen Argumente str_offset und str_length bestimmen die tatsächlichen Quell-Bytes.
'0123456789'.bytesplice(0, 3, 'abc', 0, 3) # => "abc3456789" '0123456789'.bytesplice(0, 3, 'abc', 1, 1) # => "b3456789" # Shorter source. '0123456789'.bytesplice(0, 1, 'abc', 0, 3) # => "abc123456789" # Shorter target. '0123456789'.bytesplice(0, 3, 'abc', 1, 0) # => "3456789" # Empty source. '0123456789'.bytesplice(0, 0, 'abc', 0, 3) # => "abc0123456789" # Empty target.
In der dritten Form bestimmt das Argument range die Ziel-Bytes, und die Quell-Bytes sind alle aus dem gegebenen str.
'0123456789'.bytesplice(0..2, 'abc') # => "abc3456789" '0123456789'.bytesplice(3..5, 'abc') # => "012abc6789" '0123456789'.bytesplice(0..5, 'abc') # => "abc6789" # Shorter source. '0123456789'.bytesplice(0..0, 'abc') # => "abc123456789" # Shorter target. '0123456789'.bytesplice(0..2, '') # => "3456789" # Empty source. '0123456789'.bytesplice(0...0, 'abc') # => "abc0123456789" # Empty target.
In der vierten Form, genau wie in der dritten, bestimmt das Argument range die Ziel-Bytes; das Argument str *enthält* die Quell-Bytes, und das zusätzliche Argument str_range bestimmt die tatsächlichen Quell-Bytes.
'0123456789'.bytesplice(0..2, 'abc', 0..2) # => "abc3456789" '0123456789'.bytesplice(3..5, 'abc', 0..2) # => "012abc6789" '0123456789'.bytesplice(0..2, 'abc', 0..1) # => "ab3456789" # Shorter source. '0123456789'.bytesplice(0..1, 'abc', 0..2) # => "abc23456789" # Shorter target. '0123456789'.bytesplice(0..2, 'abc', 0...0) # => "3456789" # Empty source. '0123456789'.bytesplice(0...0, 'abc', 0..2) # => "abc0123456789" # Empty target.
In jeder der Formen müssen die Anfänge und Enden von Quelle und Ziel an Zeichengrenzen liegen.
In diesen Beispielen hat self fünf 3-Byte-Zeichen und somit Zeichengrenzen bei den Offsets 0, 3, 6, 9, 12 und 15.
'こんにちは'.bytesplice(0, 3, 'abc') # => "abcんにちは" 'こんにちは'.bytesplice(1, 3, 'abc') # Raises IndexError. 'こんにちは'.bytesplice(0, 2, 'abc') # Raises IndexError.
Source
static VALUE
rb_str_capitalize(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
OnigCaseFoldType flags = ONIGENC_CASE_UPCASE | ONIGENC_CASE_TITLECASE;
VALUE ret;
flags = check_case_options(argc, argv, flags);
enc = str_true_enc(str);
if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return str;
if (flags&ONIGENC_CASE_ASCII_ONLY) {
ret = rb_str_new(0, RSTRING_LEN(str));
rb_str_ascii_casemap(str, ret, &flags, enc);
}
else {
ret = rb_str_casemap(str, &flags, enc);
}
return ret;
}
Gibt einen String zurück, der die Zeichen in self enthält, jeweils mit möglicherweise geänderter Groß-/Kleinschreibung.
-
Das erste Zeichen wird großgeschrieben.
-
Alle anderen Zeichen werden kleingeschrieben.
Beispiele
'hello'.capitalize # => "Hello" 'HELLO'.capitalize # => "Hello" 'straße'.capitalize # => "Straße" # Lowercase 'ß' not changed. 'STRAẞE'.capitalize # => "Straße" # Uppercase 'ẞ' downcased to 'ß'. 'привет'.capitalize # => "Привет" 'ПРИВЕТ'.capitalize # => "Привет"
Einige Zeichen (und einige Zeichensätze) haben keine Groß-/Kleinschreibungs-Versionen; siehe Case Mapping.
s = '1, 2, 3, ...' s.capitalize == s # => true s = 'こんにちは' s.capitalize == s # => true
Die Groß-/Kleinschreibung wird von der angegebenen mapping beeinflusst, die :ascii, :fold oder :turkic sein kann; siehe Case Mappings.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_capitalize_bang(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
OnigCaseFoldType flags = ONIGENC_CASE_UPCASE | ONIGENC_CASE_TITLECASE;
flags = check_case_options(argc, argv, flags);
str_modify_keep_cr(str);
enc = str_true_enc(str);
if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return Qnil;
if (flags&ONIGENC_CASE_ASCII_ONLY)
rb_str_ascii_casemap(str, str, &flags, enc);
else
str_shared_replace(str, rb_str_casemap(str, &flags, enc));
if (ONIGENC_CASE_MODIFIED&flags) return str;
return Qnil;
}
Wie String#capitalize, außer dass
-
die Zeichengroß-/Kleinschreibung in
self(nicht in einer Kopie vonself) geändert wird. -
selfzurückgegeben wird, wenn Änderungen vorgenommen werden, andernfallsnil.
Verwandt: Siehe Ändern.
Source
static VALUE
rb_str_casecmp(VALUE str1, VALUE str2)
{
VALUE s = rb_check_string_type(str2);
if (NIL_P(s)) {
return Qnil;
}
return str_casecmp(str1, s);
}
Ignoriert Groß-/Kleinschreibung, vergleicht self und other_string; gibt zurück:
-
-1, wenn
self.downcasekleiner alsother_string.downcaseist. -
0, wenn die beiden gleich sind.
-
1, wenn
self.downcasegrößer alsother_string.downcaseist. -
nil, wenn die beiden nicht vergleichbar sind.
Siehe Case Mapping.
Beispiele
'foo'.casecmp('goo') # => -1 'goo'.casecmp('foo') # => 1 'foo'.casecmp('food') # => -1 'food'.casecmp('foo') # => 1 'FOO'.casecmp('foo') # => 0 'foo'.casecmp('FOO') # => 0 'foo'.casecmp(1) # => nil
Verwandt: siehe Vergleichen.
Source
static VALUE
rb_str_casecmp_p(VALUE str1, VALUE str2)
{
VALUE s = rb_check_string_type(str2);
if (NIL_P(s)) {
return Qnil;
}
return str_casecmp_p(str1, s);
}
Gibt true zurück, wenn self und other_string nach Unicode-Case-Faltung gleich sind, false, wenn sie ungleich sind, nil, wenn sie nicht vergleichbar sind.
Siehe Case Mapping.
Beispiele
'foo'.casecmp?('goo') # => false 'goo'.casecmp?('foo') # => false 'foo'.casecmp?('food') # => false 'food'.casecmp?('foo') # => false 'FOO'.casecmp?('foo') # => true 'foo'.casecmp?('FOO') # => true 'foo'.casecmp?(1) # => nil
Verwandt: siehe Vergleichen.
Source
static VALUE
rb_str_center(int argc, VALUE *argv, VALUE str)
{
return rb_str_justify(argc, argv, str, 'c');
}
Gibt eine zentrierte Kopie von self zurück.
Wenn das ganzzahlige Argument size größer ist als die Größe (in Zeichen) von self, wird ein neuer String der Länge size zurückgegeben, der eine Kopie von self ist, zentriert und auf einer oder beiden Seiten mit pad_string aufgefüllt ist.
'hello'.center(6) # => "hello " # Padded on one end. 'hello'.center(10) # => " hello " # Padded on both ends. 'hello'.center(20, '-|') # => "-|-|-|-hello-|-|-|-|" # Some padding repeated. 'hello'.center(10, 'abcdefg') # => "abhelloabc" # Some padding not used. ' hello '.center(13) # => " hello " 'Привет'.center(10) # => " Привет " 'こんにちは'.center(10) # => " こんにちは " # Multi-byte characters.
Wenn size kleiner oder gleich der Größe von self ist, wird eine ungefüllte Kopie von self zurückgegeben.
'hello'.center(5) # => "hello" 'hello'.center(-10) # => "hello"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_chars(VALUE str)
{
VALUE ary = WANTARRAY("chars", rb_str_strlen(str));
return rb_str_enumerate_chars(str, ary);
}
Gibt ein Array der Zeichen in self zurück.
'hello'.chars # => ["h", "e", "l", "l", "o"] 'Привет'.chars # => ["П", "р", "и", "в", "е", "т"] 'こんにちは'.chars # => ["こ", "ん", "に", "ち", "は"] ''.chars # => []
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_chomp(int argc, VALUE *argv, VALUE str)
{
VALUE rs = chomp_rs(argc, argv);
if (NIL_P(rs)) return str_duplicate(rb_cString, str);
return rb_str_subseq(str, 0, chompped_length(str, rs));
}
Gibt einen neuen String zurück, der von self kopiert wurde, wobei nachfolgende Zeichen möglicherweise entfernt wurden.
Wenn line_sep "\n" ist, werden das letzte ein oder zwei Zeichen entfernt, wenn sie "\r", "\n" oder "\r\n" sind (aber nicht "\n\r").
$/ # => "\n" "abc\r".chomp # => "abc" "abc\n".chomp # => "abc" "abc\r\n".chomp # => "abc" "abc\n\r".chomp # => "abc\n" "тест\r\n".chomp # => "тест" "こんにちは\r\n".chomp # => "こんにちは"
Wenn line_sep '' (ein leerer String) ist, werden mehrere nachfolgende Vorkommen von "\n" oder "\r\n" entfernt (aber nicht "\r" oder "\n\r").
"abc\n\n\n".chomp('') # => "abc" "abc\r\n\r\n\r\n".chomp('') # => "abc" "abc\n\n\r\n\r\n\n\n".chomp('') # => "abc" "abc\n\r\n\r\n\r".chomp('') # => "abc\n\r\n\r\n\r" "abc\r\r\r".chomp('') # => "abc\r\r\r"
Wenn line_sep weder "\n" noch '' ist, wird ein einzelner nachfolgender Zeilentrenner entfernt, falls vorhanden.
'abcd'.chomp('cd') # => "ab" 'abcdcd'.chomp('cd') # => "abcd" 'abcd'.chomp('xx') # => "abcd"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_chomp_bang(int argc, VALUE *argv, VALUE str)
{
VALUE rs;
str_modifiable(str);
if (RSTRING_LEN(str) == 0 && argc < 2) return Qnil;
rs = chomp_rs(argc, argv);
if (NIL_P(rs)) return Qnil;
return rb_str_chomp_string(str, rs);
}
Wie String#chomp, außer dass
-
nachfolgende Zeichen aus
selfentfernt werden (nicht aus einer Kopie vonself). -
selfzurückgegeben wird, wenn Zeichen entfernt werden, andernfallsnil.
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_chop(VALUE str)
{
return rb_str_subseq(str, 0, chopped_length(str));
}
Gibt einen neuen String zurück, der von self kopiert wurde, wobei nachfolgende Zeichen möglicherweise entfernt wurden.
Entfernt "\r\n", wenn dies die letzten beiden Zeichen sind.
"abc\r\n".chop # => "abc" "тест\r\n".chop # => "тест" "こんにちは\r\n".chop # => "こんにちは"
Andernfalls wird das letzte Zeichen entfernt, wenn es vorhanden ist.
'abcd'.chop # => "abc" 'тест'.chop # => "тес" 'こんにちは'.chop # => "こんにち" ''.chop # => ""
Wenn Sie nur den Zeilentrennzeichen am Ende des Strings entfernen müssen, ist String#chomp eine bessere Alternative.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_chop_bang(VALUE str)
{
str_modify_keep_cr(str);
if (RSTRING_LEN(str) > 0) {
long len;
len = chopped_length(str);
STR_SET_LEN(str, len);
TERM_FILL(&RSTRING_PTR(str)[len], TERM_LEN(str));
if (ENC_CODERANGE(str) != ENC_CODERANGE_7BIT) {
ENC_CODERANGE_CLEAR(str);
}
return str;
}
return Qnil;
}
Wie String#chop, außer dass
-
nachfolgende Zeichen aus
selfentfernt werden (nicht aus einer Kopie vonself). -
selfzurückgegeben wird, wenn Zeichen entfernt werden, andernfallsnil.
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_chr(VALUE str)
{
return rb_str_substr(str, 0, 1);
}
Gibt einen String zurück, der das erste Zeichen von self enthält.
'hello'.chr # => "h" 'тест'.chr # => "т" 'こんにちは'.chr # => "こ" ''.chr # => ""
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_clear(VALUE str)
{
str_discard(str);
STR_SET_EMBED(str);
STR_SET_LEN(str, 0);
RSTRING_PTR(str)[0] = 0;
if (rb_enc_asciicompat(STR_ENC_GET(str)))
ENC_CODERANGE_SET(str, ENC_CODERANGE_7BIT);
else
ENC_CODERANGE_SET(str, ENC_CODERANGE_VALID);
return str;
}
Source
static VALUE
rb_str_codepoints(VALUE str)
{
VALUE ary = WANTARRAY("codepoints", rb_str_strlen(str));
return rb_str_enumerate_codepoints(str, ary);
}
Gibt ein Array der Codepunkte in self zurück; jeder Codepunkt ist der ganzzahlige Wert für ein Zeichen.
'hello'.codepoints # => [104, 101, 108, 108, 111] 'тест'.codepoints # => [1090, 1077, 1089, 1090] 'こんにちは'.codepoints # => [12371, 12435, 12395, 12385, 12399] ''.codepoints # => []
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_concat_multi(int argc, VALUE *argv, VALUE str)
{
str_modifiable(str);
if (argc == 1) {
return rb_str_concat(str, argv[0]);
}
else if (argc > 1) {
int i;
VALUE arg_str = rb_str_tmp_new(0);
rb_enc_copy(arg_str, str);
for (i = 0; i < argc; i++) {
rb_str_concat(arg_str, argv[i]);
}
rb_str_buf_append(str, arg_str);
}
return str;
}
Verkettet jedes Objekt in objects an self; gibt self zurück.
'foo'.concat('bar', 'baz') # => "foobarbaz"
Für jedes gegebene Objekt object, das eine ganze Zahl ist, wird der Wert als Codepunkt betrachtet und vor der Verkettung in ein Zeichen umgewandelt.
'foo'.concat(32, 'bar', 32, 'baz') # => "foo bar baz" # Embeds spaces. 'те'.concat(1089, 1090) # => "тест" 'こん'.concat(12395, 12385, 12399) # => "こんにちは"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_count(int argc, VALUE *argv, VALUE str)
{
char table[TR_TABLE_SIZE];
rb_encoding *enc = 0;
VALUE del = 0, nodel = 0, tstr;
char *s, *send;
int i;
int ascompat;
size_t n = 0;
rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
tstr = argv[0];
StringValue(tstr);
enc = rb_enc_check(str, tstr);
if (argc == 1) {
const char *ptstr;
if (RSTRING_LEN(tstr) == 1 && rb_enc_asciicompat(enc) &&
(ptstr = RSTRING_PTR(tstr),
ONIGENC_IS_ALLOWED_REVERSE_MATCH(enc, (const unsigned char *)ptstr, (const unsigned char *)ptstr+1)) &&
!is_broken_string(str)) {
int clen;
unsigned char c = rb_enc_codepoint_len(ptstr, ptstr+1, &clen, enc);
s = RSTRING_PTR(str);
if (!s || RSTRING_LEN(str) == 0) return INT2FIX(0);
send = RSTRING_END(str);
while (s < send) {
if (*(unsigned char*)s++ == c) n++;
}
return SIZET2NUM(n);
}
}
tr_setup_table(tstr, table, TRUE, &del, &nodel, enc);
for (i=1; i<argc; i++) {
tstr = argv[i];
StringValue(tstr);
enc = rb_enc_check(str, tstr);
tr_setup_table(tstr, table, FALSE, &del, &nodel, enc);
}
s = RSTRING_PTR(str);
if (!s || RSTRING_LEN(str) == 0) return INT2FIX(0);
send = RSTRING_END(str);
ascompat = rb_enc_asciicompat(enc);
while (s < send) {
unsigned int c;
if (ascompat && (c = *(unsigned char*)s) < 0x80) {
if (table[c]) {
n++;
}
s++;
}
else {
int clen;
c = rb_enc_codepoint_len(s, send, &clen, enc);
if (tr_find(c, table, del, nodel)) {
n++;
}
s += clen;
}
}
return SIZET2NUM(n);
}
Gibt die Gesamtzahl der Zeichen in self zurück, die durch die gegebenen Selektoren angegeben sind.
Für einen 1-Zeichen-Selektor wird die Anzahl der Vorkommen dieses Zeichens zurückgegeben.
s = 'abracadabra' s.count('a') # => 5 s.count('b') # => 2 s.count('x') # => 0 s.count('') # => 0 s = 'тест' s.count('т') # => 2 s.count('е') # => 1 s = 'よろしくお願いします' s.count('よ') # => 1 s.count('し') # => 2
Für einen Mehrzeichen-Selektor wird die Anzahl der Vorkommen für alle angegebenen Zeichen zurückgegeben.
s = 'abracadabra' s.count('ab') # => 7 s.count('abc') # => 8 s.count('abcd') # => 9 s.count('abcdr') # => 11 s.count('abcdrx') # => 11
Reihenfolge und Wiederholung spielen keine Rolle.
s.count('ba') == s.count('ab') # => true s.count('baab') == s.count('ab') # => true
Für mehrere Selektoren wird ein einziger Selektor gebildet, der die Schnittmenge der Zeichen in allen Selektoren ist, und die Anzahl der Vorkommen für diesen Selektor wird zurückgegeben.
s = 'abcdefg' s.count('abcde', 'dcbfg') == s.count('bcd') # => true s.count('abc', 'def') == s.count('') # => true
In einem Zeichenselektor werden drei Zeichen besonders behandelt.
-
Ein Caret (
'^') fungiert als Negationsoperator für die unmittelbar folgenden Zeichen.s = 'abracadabra' s.count('^bc') # => 8 # Count of all except 'b' and 'c'.
-
Ein Bindestrich (
'-') zwischen zwei anderen Zeichen definiert einen Bereich von Zeichen.s = 'abracadabra' s.count('a-c') # => 8 # Count of all 'a', 'b', and 'c'.
-
Ein Backslash (
'\') dient als Escape-Zeichen für einen Caret, einen Bindestrich oder einen anderen Backslash.s = 'abracadabra' s.count('\^bc') # => 3 # Count of '^', 'b', and 'c'. s.count('a\-c') # => 6 # Count of 'a', '-', and 'c'. 'foo\bar\baz'.count('\\') # => 2 # Count of '\'.
Diese Verwendungen können gemischt werden.
s = 'abracadabra' s.count('a-cq-t') # => 10 # Multiple ranges. s.count('ac-d') # => 7 # Range mixed with plain characters. s.count('^a-c') # => 3 # Range mixed with negation.
Für mehrere Selektoren können alle Formen verwendet werden, einschließlich Negationen, Bereiche und Escapes.
s = 'abracadabra' s.count('^abc', '^def') == s.count('^abcdef') # => true s.count('a-e', 'c-g') == s.count('cde') # => true s.count('^abc', 'c-g') == s.count('defg') # => true
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_crypt(VALUE str, VALUE salt)
{
#ifdef HAVE_CRYPT_R
VALUE databuf;
struct crypt_data *data;
# define CRYPT_END() ALLOCV_END(databuf)
#else
char *tmp_buf;
extern char *crypt(const char *, const char *);
# define CRYPT_END() rb_nativethread_lock_unlock(&crypt_mutex.lock)
#endif
VALUE result;
const char *s, *saltp;
char *res;
#ifdef BROKEN_CRYPT
char salt_8bit_clean[3];
#endif
StringValue(salt);
mustnot_wchar(str);
mustnot_wchar(salt);
s = StringValueCStr(str);
saltp = RSTRING_PTR(salt);
if (RSTRING_LEN(salt) < 2 || !saltp[0] || !saltp[1]) {
rb_raise(rb_eArgError, "salt too short (need >=2 bytes)");
}
#ifdef BROKEN_CRYPT
if (!ISASCII((unsigned char)saltp[0]) || !ISASCII((unsigned char)saltp[1])) {
salt_8bit_clean[0] = saltp[0] & 0x7f;
salt_8bit_clean[1] = saltp[1] & 0x7f;
salt_8bit_clean[2] = '\0';
saltp = salt_8bit_clean;
}
#endif
#ifdef HAVE_CRYPT_R
data = ALLOCV(databuf, sizeof(struct crypt_data));
# ifdef HAVE_STRUCT_CRYPT_DATA_INITIALIZED
data->initialized = 0;
# endif
res = crypt_r(s, saltp, data);
#else
rb_nativethread_lock_lock(&crypt_mutex.lock);
res = crypt(s, saltp);
#endif
if (!res) {
int err = errno;
CRYPT_END();
rb_syserr_fail(err, "crypt");
}
#ifdef HAVE_CRYPT_R
result = rb_str_new_cstr(res);
CRYPT_END();
#else
// We need to copy this buffer because it's static and we need to unlock the mutex
// before allocating a new object (the string to be returned). If we allocate while
// holding the lock, we could run GC which fires the VM barrier and causes a deadlock
// if other ractors are waiting on this lock.
size_t res_size = strlen(res)+1;
tmp_buf = ALLOCA_N(char, res_size); // should be small enough to alloca
memcpy(tmp_buf, res, res_size);
res = tmp_buf;
CRYPT_END();
result = rb_str_new_cstr(res);
#endif
return result;
}
Gibt den String zurück, der durch Aufruf der Standardbibliotheksfunktion crypt(3) mit str und salt_str in dieser Reihenfolge als Argumente generiert wurde. Bitte verwenden Sie diese Methode nicht mehr. Sie ist veraltet und nur zur Abwärtskompatibilität mit Ruby-Skripten aus früheren Zeiten vorhanden. Sie ist aus mehreren Gründen schlecht für die Verwendung in zeitgenössischen Programmen.
-
Das Verhalten von C's
crypt(3)hängt vom Betriebssystem ab, auf dem es ausgeführt wird. Der generierte String hat keine Datenportabilität. -
Auf einigen Betriebssystemen wie Mac OS schlägt
crypt(3)nie fehl (d.h. es kommt stillschweigend zu unerwarteten Ergebnissen). -
Auf einigen Betriebssystemen wie Mac OS ist
crypt(3)nicht Thread-sicher. -
Die sogenannte "traditionelle" Verwendung von
crypt(3)ist sehr, sehr, sehr schwach. Laut seiner Manpage hat die traditionellecrypt(3)-Ausgabe von Linux nur 2**56 Variationen; heute zu leicht zu bruteforcen. Und das ist das Standardverhalten. -
Um Dinge robust zu machen, implementieren einige Betriebssysteme die sogenannte "modulare" Verwendung. Um dies zu erreichen, müssen Sie eine komplexe Erstellung des Parameters
salt_strmanuell durchführen. Fehler bei der Erstellung eines richtigen Salt-Strings führen tendenziell nicht zu Fehlern; Tippfehler in Parametern sind normalerweise nicht erkennbar.-
Zum Beispiel ist im folgenden Beispiel der zweite Aufruf von
String#cryptfalsch; er hat einen Tippfehler in "round=" (fehlt "s"). Der Aufruf schlägt jedoch nicht fehl und etwas Unerwartetes wird generiert."foo".crypt("$5$rounds=1000$salt$") # OK, proper usage "foo".crypt("$5$round=1000$salt$") # Typo not detected
-
-
Selbst im "modularen" Modus gelten einige Hash-Funktionen als archaisch und werden überhaupt nicht mehr empfohlen; zum Beispiel wird das Modul
$1$offiziell von seinem Autor aufgegeben: siehe phk.freebsd.dk/sagas/md5crypt_eol/ . Ein weiteres Beispiel ist das Modul$3$, das als völlig fehlerhaft gilt: siehe die Manpage von FreeBSD. -
Auf einigen Betriebssystemen wie Mac OS gibt es keinen modularen Modus. Dennoch, wie oben geschrieben, schlägt
crypt(3)auf Mac OS nie fehl. Das bedeutet, selbst wenn Sie einen richtigen Salt-String erstellen, wird trotzdem ein traditioneller DES-Hash generiert, und es gibt keine Möglichkeit, dies zu erkennen."foo".crypt("$5$rounds=1000$salt$") # => "$5fNPQMxC5j6."
Wenn Sie aus irgendeinem Grund nicht zu anderen sicheren zeitgenössischen Passwort-Hashing-Algorithmen migrieren können, installieren Sie das Gem string-crypt und require 'string/crypt', um es weiterhin zu verwenden.
Gibt einen eingefrorenen String zurück, der mit self identisch ist.
Der zurückgegebene String ist self, wenn und nur wenn alle folgenden Bedingungen erfüllt sind
-
selfist bereits eingefroren. -
selfist eine Instanz von String (nicht von einer Unterklasse von String) -
selfhat keine Instanzvariablen gesetzt.
Andernfalls ist der zurückgegebene String eine eingefrorene Kopie von self.
Das Zurückgeben von self, wann immer möglich, vermeidet das Duplizieren von self; siehe Data deduplication.
Es kann auch das Duplizieren anderer, bereits vorhandener Strings vermeiden.
s0 = 'foo' s1 = 'foo' s0.object_id == s1.object_id # => false (-s0).object_id == (-s1).object_id # => true
Beachten Sie, dass die Methode -@ praktisch für die Definition einer Konstante ist.
FileName = -'config/database.yml'
Während ihr Alias dedup besser zum Verketten geeignet ist.
'foo'.dedup.gsub!('o')
Verwandt: siehe Einfrieren/Entfrieren.
Source
static VALUE
rb_str_delete(int argc, VALUE *argv, VALUE str)
{
str = str_duplicate(rb_cString, str);
rb_str_delete_bang(argc, argv, str);
return str;
}
Gibt einen neuen String zurück, der eine Kopie von self ist, wobei bestimmte Zeichen entfernt wurden; die entfernten Zeichen sind alle Vorkommen der durch den gegebenen String selectors angegebenen Zeichen.
Für einen 1-Zeichen-Selektor werden alle Vorkommen dieses Zeichens entfernt.
s = 'abracadabra' s.delete('a') # => "brcdbr" s.delete('b') # => "aracadara" s.delete('x') # => "abracadabra" s.delete('') # => "abracadabra" s = 'тест' s.delete('т') # => "ес" s.delete('е') # => "тст" s = 'よろしくお願いします' s.delete('よ') # => "ろしくお願いします" s.delete('し') # => "よろくお願います"
Für einen Mehrzeichen-Selektor werden alle Vorkommen der angegebenen Zeichen entfernt.
s = 'abracadabra' s.delete('ab') # => "rcdr" s.delete('abc') # => "rdr" s.delete('abcd') # => "rr" s.delete('abcdr') # => "" s.delete('abcdrx') # => ""
Reihenfolge und Wiederholung spielen keine Rolle.
s.delete('ba') == s.delete('ab') # => true s.delete('baab') == s.delete('ab') # => true
Für mehrere Selektoren wird ein einziger Selektor gebildet, der die Schnittmenge der Zeichen in allen Selektoren ist, und alle Vorkommen der durch diesen Selektor angegebenen Zeichen werden entfernt.
s = 'abcdefg' s.delete('abcde', 'dcbfg') == s.delete('bcd') # => true s.delete('abc', 'def') == s.delete('') # => true
In einem Zeichenselektor werden drei Zeichen besonders behandelt.
-
Ein Caret (
'^') fungiert als Negationsoperator für die unmittelbar folgenden Zeichen.s = 'abracadabra' s.delete('^bc') # => "bcb" # Deletes all except 'b' and 'c'.
-
Ein Bindestrich (
'-') zwischen zwei anderen Zeichen definiert einen Bereich von Zeichen.s = 'abracadabra' s.delete('a-c') # => "rdr" # Deletes all 'a', 'b', and 'c'.
-
Ein Backslash (
'\') dient als Escape-Zeichen für einen Caret, einen Bindestrich oder einen anderen Backslash.s = 'abracadabra' s.delete('\^bc') # => "araadara" # Deletes all '^', 'b', and 'c'. s.delete('a\-c') # => "brdbr" # Deletes all 'a', '-', and 'c'. 'foo\bar\baz'.delete('\\') # => "foobarbaz" # Deletes all '\'.
Diese Verwendungen können gemischt werden.
s = 'abracadabra' s.delete('a-cq-t') # => "d" # Multiple ranges. s.delete('ac-d') # => "brbr" # Range mixed with plain characters. s.delete('^a-c') # => "abacaaba" # Range mixed with negation.
Für mehrere Selektoren können alle Formen verwendet werden, einschließlich Negationen, Bereiche und Escapes.
s = 'abracadabra' s.delete('^abc', '^def') == s.delete('^abcdef') # => true s.delete('a-e', 'c-g') == s.delete('cde') # => true s.delete('^abc', 'c-g') == s.delete('defg') # => true
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_delete_bang(int argc, VALUE *argv, VALUE str)
{
char squeez[TR_TABLE_SIZE];
rb_encoding *enc = 0;
char *s, *send, *t;
VALUE del = 0, nodel = 0;
int modify = 0;
int i, ascompat, cr;
if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return Qnil;
rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
for (i=0; i<argc; i++) {
VALUE s = argv[i];
StringValue(s);
enc = rb_enc_check(str, s);
tr_setup_table(s, squeez, i==0, &del, &nodel, enc);
}
str_modify_keep_cr(str);
ascompat = rb_enc_asciicompat(enc);
s = t = RSTRING_PTR(str);
send = RSTRING_END(str);
cr = ascompat ? ENC_CODERANGE_7BIT : ENC_CODERANGE_VALID;
while (s < send) {
unsigned int c;
int clen;
if (ascompat && (c = *(unsigned char*)s) < 0x80) {
if (squeez[c]) {
modify = 1;
}
else {
if (t != s) *t = c;
t++;
}
s++;
}
else {
c = rb_enc_codepoint_len(s, send, &clen, enc);
if (tr_find(c, squeez, del, nodel)) {
modify = 1;
}
else {
if (t != s) rb_enc_mbcput(c, t, enc);
t += clen;
if (cr == ENC_CODERANGE_7BIT) cr = ENC_CODERANGE_VALID;
}
s += clen;
}
}
TERM_FILL(t, TERM_LEN(str));
STR_SET_LEN(str, t - RSTRING_PTR(str));
ENC_CODERANGE_SET(str, cr);
if (modify) return str;
return Qnil;
}
Wie String#delete, aber modifiziert self direkt; gibt self zurück, wenn Zeichen gelöscht wurden, andernfalls nil.
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_delete_prefix(VALUE str, VALUE prefix)
{
long prefixlen;
prefixlen = deleted_prefix_length(str, prefix);
if (prefixlen <= 0) return str_duplicate(rb_cString, str);
return rb_str_subseq(str, prefixlen, RSTRING_LEN(str) - prefixlen);
}
Gibt eine Kopie von self zurück, bei der der führende Teilstring prefix entfernt wurde.
'oof'.delete_prefix('o') # => "of" 'oof'.delete_prefix('oo') # => "f" 'oof'.delete_prefix('oof') # => "" 'oof'.delete_prefix('x') # => "oof" 'тест'.delete_prefix('те') # => "ст" 'こんにちは'.delete_prefix('こん') # => "にちは"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_delete_prefix_bang(VALUE str, VALUE prefix)
{
long prefixlen;
str_modify_keep_cr(str);
prefixlen = deleted_prefix_length(str, prefix);
if (prefixlen <= 0) return Qnil;
return rb_str_drop_bytes(str, prefixlen);
}
Wie String#delete_prefix, außer dass self direkt modifiziert wird; gibt self zurück, wenn das Präfix entfernt wird, andernfalls nil.
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_delete_suffix(VALUE str, VALUE suffix)
{
long suffixlen;
suffixlen = deleted_suffix_length(str, suffix);
if (suffixlen <= 0) return str_duplicate(rb_cString, str);
return rb_str_subseq(str, 0, RSTRING_LEN(str) - suffixlen);
}
Gibt eine Kopie von self zurück, bei der der nachfolgende Teilstring suffix entfernt wurde.
'foo'.delete_suffix('o') # => "fo" 'foo'.delete_suffix('oo') # => "f" 'foo'.delete_suffix('foo') # => "" 'foo'.delete_suffix('f') # => "foo" 'foo'.delete_suffix('x') # => "foo" 'тест'.delete_suffix('ст') # => "те" 'こんにちは'.delete_suffix('ちは') # => "こんに"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_delete_suffix_bang(VALUE str, VALUE suffix)
{
long olen, suffixlen, len;
str_modifiable(str);
suffixlen = deleted_suffix_length(str, suffix);
if (suffixlen <= 0) return Qnil;
olen = RSTRING_LEN(str);
str_modify_keep_cr(str);
len = olen - suffixlen;
STR_SET_LEN(str, len);
TERM_FILL(&RSTRING_PTR(str)[len], TERM_LEN(str));
if (ENC_CODERANGE(str) != ENC_CODERANGE_7BIT) {
ENC_CODERANGE_CLEAR(str);
}
return str;
}
Wie String#delete_suffix, außer dass self direkt modifiziert wird; gibt self zurück, wenn das Suffix entfernt wird, andernfalls nil.
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_downcase(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
OnigCaseFoldType flags = ONIGENC_CASE_DOWNCASE;
VALUE ret;
flags = check_case_options(argc, argv, flags);
enc = str_true_enc(str);
if (case_option_single_p(flags, enc, str)) {
ret = rb_str_new(RSTRING_PTR(str), RSTRING_LEN(str));
str_enc_copy_direct(ret, str);
downcase_single(ret);
}
else if (flags&ONIGENC_CASE_ASCII_ONLY) {
ret = rb_str_new(0, RSTRING_LEN(str));
rb_str_ascii_casemap(str, ret, &flags, enc);
}
else {
ret = rb_str_casemap(str, &flags, enc);
}
return ret;
}
Gibt einen neuen String zurück, der die kleingeschriebenen Zeichen in self enthält.
'HELLO'.downcase # => "hello" 'STRAẞE'.downcase # => "straße" 'ПРИВЕТ'.downcase # => "привет" 'RubyGems.org'.downcase # => "rubygems.org"
Einige Zeichen (und einige Zeichensätze) haben keine Groß-/Kleinschreibungs-Versionen; siehe Case Mapping.
s = '1, 2, 3, ...' s.downcase == s # => true s = 'こんにちは' s.downcase == s # => true
Die Groß-/Kleinschreibung wird von der angegebenen mapping beeinflusst, die :ascii, :fold oder :turkic sein kann; siehe Case Mappings.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_downcase_bang(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
OnigCaseFoldType flags = ONIGENC_CASE_DOWNCASE;
flags = check_case_options(argc, argv, flags);
str_modify_keep_cr(str);
enc = str_true_enc(str);
if (case_option_single_p(flags, enc, str)) {
if (downcase_single(str))
flags |= ONIGENC_CASE_MODIFIED;
}
else if (flags&ONIGENC_CASE_ASCII_ONLY)
rb_str_ascii_casemap(str, str, &flags, enc);
else
str_shared_replace(str, rb_str_casemap(str, &flags, enc));
if (ONIGENC_CASE_MODIFIED&flags) return str;
return Qnil;
}
Wie String#downcase, außer dass
-
die Zeichengroß-/Kleinschreibung in
self(nicht in einer Kopie vonself) geändert wird. -
selfzurückgegeben wird, wenn Änderungen vorgenommen werden, andernfallsnil.
Verwandt: Siehe Ändern.
Source
VALUE
rb_str_dump(VALUE str)
{
int encidx = rb_enc_get_index(str);
rb_encoding *enc = rb_enc_from_index(encidx);
long len;
const char *p, *pend;
char *q, *qend;
VALUE result;
int u8 = (encidx == rb_utf8_encindex());
static const char nonascii_suffix[] = ".dup.force_encoding(\"%s\")";
len = 2; /* "" */
if (!rb_enc_asciicompat(enc)) {
len += strlen(nonascii_suffix) - rb_strlen_lit("%s");
len += strlen(enc->name);
}
p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
while (p < pend) {
int clen;
unsigned char c = *p++;
switch (c) {
case '"': case '\\':
case '\n': case '\r':
case '\t': case '\f':
case '\013': case '\010': case '\007': case '\033':
clen = 2;
break;
case '#':
clen = IS_EVSTR(p, pend) ? 2 : 1;
break;
default:
if (ISPRINT(c)) {
clen = 1;
}
else {
if (u8 && c > 0x7F) { /* \u notation */
int n = rb_enc_precise_mbclen(p-1, pend, enc);
if (MBCLEN_CHARFOUND_P(n)) {
unsigned int cc = rb_enc_mbc_to_codepoint(p-1, pend, enc);
if (cc <= 0xFFFF)
clen = 6; /* \uXXXX */
else if (cc <= 0xFFFFF)
clen = 9; /* \u{XXXXX} */
else
clen = 10; /* \u{XXXXXX} */
p += MBCLEN_CHARFOUND_LEN(n)-1;
break;
}
}
clen = 4; /* \xNN */
}
break;
}
if (clen > LONG_MAX - len) {
rb_raise(rb_eRuntimeError, "string size too big");
}
len += clen;
}
result = rb_str_new(0, len);
p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
q = RSTRING_PTR(result); qend = q + len + 1;
*q++ = '"';
while (p < pend) {
unsigned char c = *p++;
if (c == '"' || c == '\\') {
*q++ = '\\';
*q++ = c;
}
else if (c == '#') {
if (IS_EVSTR(p, pend)) *q++ = '\\';
*q++ = '#';
}
else if (c == '\n') {
*q++ = '\\';
*q++ = 'n';
}
else if (c == '\r') {
*q++ = '\\';
*q++ = 'r';
}
else if (c == '\t') {
*q++ = '\\';
*q++ = 't';
}
else if (c == '\f') {
*q++ = '\\';
*q++ = 'f';
}
else if (c == '\013') {
*q++ = '\\';
*q++ = 'v';
}
else if (c == '\010') {
*q++ = '\\';
*q++ = 'b';
}
else if (c == '\007') {
*q++ = '\\';
*q++ = 'a';
}
else if (c == '\033') {
*q++ = '\\';
*q++ = 'e';
}
else if (ISPRINT(c)) {
*q++ = c;
}
else {
*q++ = '\\';
if (u8) {
int n = rb_enc_precise_mbclen(p-1, pend, enc) - 1;
if (MBCLEN_CHARFOUND_P(n)) {
int cc = rb_enc_mbc_to_codepoint(p-1, pend, enc);
p += n;
if (cc <= 0xFFFF)
snprintf(q, qend-q, "u%04X", cc); /* \uXXXX */
else
snprintf(q, qend-q, "u{%X}", cc); /* \u{XXXXX} or \u{XXXXXX} */
q += strlen(q);
continue;
}
}
snprintf(q, qend-q, "x%02X", c);
q += 3;
}
}
*q++ = '"';
*q = '\0';
if (!rb_enc_asciicompat(enc)) {
snprintf(q, qend-q, nonascii_suffix, enc->name);
encidx = rb_ascii8bit_encindex();
}
/* result from dump is ASCII */
rb_enc_associate_index(result, encidx);
ENC_CODERANGE_SET(result, ENC_CODERANGE_7BIT);
return result;
}
Für einen gewöhnlichen String gibt diese Methode, +String#dump+, eine druckbare, nur-ASCII-Version von self zurück, eingeschlossen in doppelte Anführungszeichen.
Für einen gedumpten String ist die Methode String#undump die Umkehrung von +String#dump+; sie gibt eine "wiederhergestellte" Version von self zurück, bei der alle Dump-Änderungen rückgängig gemacht wurden.
Im einfachsten Fall enthält der gedumpte String den ursprünglichen String, eingeschlossen in doppelte Anführungszeichen; dieses Beispiel wird in irb (interactive Ruby) gezeigt, das die Methode 'inspect` verwendet, um die Ergebnisse darzustellen.
s = 'hello' # => "hello" s.dump # => "\"hello\"" s.dump.undump # => "hello"
Beachten Sie, dass in der zweiten Zeile oben
-
die äußeren doppelten Anführungszeichen von
inspectgesetzt werden und nicht Teil der Ausgabe vondumpsind. -
Die inneren doppelten Anführungszeichen sind Teil der Ausgabe von
dumpund werden voninspectescaped, da sie sich innerhalb der äußeren doppelten Anführungszeichen befinden.
Um Verwirrung zu vermeiden, verwenden wir diese Hilfsmethode, um die äußeren doppelten Anführungszeichen wegzulassen.
def dump(s) print "String: ", s, "\n" print "Dumped: ", s.dump, "\n" print "Undumped: ", s.dump.undump, "\n" end
So dass wir für den String 'hello' Folgendes sehen:
String: hello Dumped: "hello" Undumped: hello
In einem Dump werden bestimmte Sonderzeichen escaped.
String: " Dumped: "\"" Undumped: " String: \ Dumped: "\\" Undumped: \
In einem Dump werden nicht druckbare Zeichen durch druckbare ersetzt; die nicht druckbaren Zeichen sind die Leerzeichen (außer dem Leerzeichen selbst); hier sehen wir die Ordinalwerte für diese Zeichen zusammen mit erklärendem Text.
h = { 7 => 'Alert (BEL)', 8 => 'Backspace (BS)', 9 => 'Horizontal tab (HT)', 10 => 'Linefeed (LF)', 11 => 'Vertical tab (VT)', 12 => 'Formfeed (FF)', 13 => 'Carriage return (CR)' }
In diesem Beispiel wird die gedumpte Ausgabe von der Methode inspect ausgegeben und enthält daher sowohl äußere doppelte Anführungszeichen als auch escaped innere doppelte Anführungszeichen.
s = '' h.keys.each {|i| s << i } # => [7, 8, 9, 10, 11, 12, 13] s # => "\a\b\t\n\v\f\r" s.dump # => "\"\\a\\b\\t\\n\\v\\f\\r\""
Wenn self in UTF-8 kodiert ist und Unicode-Zeichen enthält, wird jedes Unicode-Zeichen als Unicode-Escape-Sequenz gedumpt.
String: тест Dumped: "\u0442\u0435\u0441\u0442" Undumped: тест String: こんにちは Dumped: "\u3053\u3093\u306B\u3061\u306F" Undumped: こんにちは
Wenn die Kodierung von self nicht ASCII-kompatibel ist (d.h. wenn self.encoding.ascii_compatible? false zurückgibt), wird jedes ASCII-kompatible Byte als ASCII-Zeichen gedumpt, und alle anderen Bytes werden als Hexadezimalwerte gedumpt; außerdem wird .dup.force_encoding(\"encoding\") angehängt, wobei <encoding> self.encoding.name ist.
String: hello
Dumped: "\xFE\xFF\x00h\x00e\x00l\x00l\x00o".dup.force_encoding("UTF-16")
Undumped: hello
String: тест
Dumped: "\xFE\xFF\x04B\x045\x04A\x04B".dup.force_encoding("UTF-16")
Undumped: тест
String: こんにちは
Dumped: "\xFE\xFF0S0\x930k0a0o".dup.force_encoding("UTF-16")
Undumped: こんにちは
Source
static VALUE
rb_str_each_byte(VALUE str)
{
RETURN_SIZED_ENUMERATOR(str, 0, 0, rb_str_each_byte_size);
return rb_str_enumerate_bytes(str, 0);
}
Mit einem Block wird der Block mit jedem aufeinanderfolgenden Byte aus self aufgerufen; gibt self zurück.
a = [] 'hello'.each_byte {|byte| a.push(byte) } # Five 1-byte characters. a # => [104, 101, 108, 108, 111] a = [] 'тест'.each_byte {|byte| a.push(byte) } # Four 2-byte characters. a # => [209, 130, 208, 181, 209, 129, 209, 130] a = [] 'こんにちは'.each_byte {|byte| a.push(byte) } # Five 3-byte characters. a # => [227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175]
Ohne Block wird ein Enumerator zurückgegeben.
Verwandt: siehe Iterieren.
Source
static VALUE
rb_str_each_char(VALUE str)
{
RETURN_SIZED_ENUMERATOR(str, 0, 0, rb_str_each_char_size);
return rb_str_enumerate_chars(str, 0);
}
Mit einem Block wird der Block mit jedem aufeinanderfolgenden Zeichen aus self aufgerufen; gibt self zurück.
a = [] 'hello'.each_char do |char| a.push(char) end a # => ["h", "e", "l", "l", "o"] a = [] 'тест'.each_char do |char| a.push(char) end a # => ["т", "е", "с", "т"] a = [] 'こんにちは'.each_char do |char| a.push(char) end a # => ["こ", "ん", "に", "ち", "は"]
Ohne Block wird ein Enumerator zurückgegeben.
Verwandt: siehe Iterieren.
Source
static VALUE
rb_str_each_codepoint(VALUE str)
{
RETURN_SIZED_ENUMERATOR(str, 0, 0, rb_str_each_char_size);
return rb_str_enumerate_codepoints(str, 0);
}
Mit einem Block wird der Block mit jedem aufeinanderfolgenden Codepunkt aus self aufgerufen; jeder Codepunkt ist der ganzzahlige Wert für ein Zeichen; gibt self zurück.
a = [] 'hello'.each_codepoint do |codepoint| a.push(codepoint) end a # => [104, 101, 108, 108, 111] a = [] 'тест'.each_codepoint do |codepoint| a.push(codepoint) end a # => [1090, 1077, 1089, 1090] a = [] 'こんにちは'.each_codepoint do |codepoint| a.push(codepoint) end a # => [12371, 12435, 12395, 12385, 12399]
Ohne Block wird ein Enumerator zurückgegeben.
Verwandt: siehe Iterieren.
Source
static VALUE
rb_str_each_grapheme_cluster(VALUE str)
{
RETURN_SIZED_ENUMERATOR(str, 0, 0, rb_str_each_grapheme_cluster_size);
return rb_str_enumerate_grapheme_clusters(str, 0);
}
Mit einem Block wird der gegebene Block mit jedem aufeinanderfolgenden Graphem-Cluster aus self aufgerufen (siehe Unicode Grapheme Cluster Boundaries); gibt self zurück.
a = [] 'hello'.each_grapheme_cluster do |grapheme_cluster| a.push(grapheme_cluster) end a # => ["h", "e", "l", "l", "o"] a = [] 'тест'.each_grapheme_cluster do |grapheme_cluster| a.push(grapheme_cluster) end a # => ["т", "е", "с", "т"] a = [] 'こんにちは'.each_grapheme_cluster do |grapheme_cluster| a.push(grapheme_cluster) end a # => ["こ", "ん", "に", "ち", "は"]
Ohne Block wird ein Enumerator zurückgegeben.
Verwandt: siehe Iterieren.
Source
static VALUE
rb_str_each_line(int argc, VALUE *argv, VALUE str)
{
RETURN_SIZED_ENUMERATOR(str, argc, argv, 0);
return rb_str_enumerate_lines(argc, argv, str, 0);
}
Mit einem Block werden die Teilstrings (Zeilen) gebildet, die sich aus dem Aufteilen von self an jedem Vorkommen des gegebenen record_separator ergeben; jede Zeile wird an den Block übergeben; gibt self zurück.
Mit den Standard-record_separator-Argumentwerten
$/ # => "\n" s = <<~EOT This is the first line. This is line two. This is line four. This is line five. EOT s.each_line {|line| p line }
Ausgabe
"This is the first line.\n" "This is line two.\n" "\n" "This is line four.\n" "This is line five.\n"
Mit einem anderen record_separator
record_separator = ' is ' s.each_line(record_separator) {|line| p line }
Ausgabe
"This is " "the first line.\nThis is " "line two.\n\nThis is " "line four.\nThis is " "line five.\n"
Mit chomp als true werden die nachfolgenden record_separator von jeder Zeile entfernt.
s.each_line(chomp: true) {|line| p line }
Ausgabe
"This is the first line." "This is line two." "" "This is line four." "This is line five."
Mit einem leeren String als record_separator werden "Paragraphen" gebildet, indem an jedem Vorkommen von zwei oder mehr Zeilenumbrüchen aufgeteilt wird.
record_separator = '' s.each_line(record_separator) {|line| p line }
Ausgabe
"This is the first line.\nThis is line two.\n\n" "This is line four.\nThis is line five.\n"
Ohne Block wird ein Enumerator zurückgegeben.
Verwandt: siehe Iterieren.
Source
static VALUE
rb_str_empty(VALUE str)
{
return RBOOL(RSTRING_LEN(str) == 0);
}
Gibt zurück, ob die Länge von self null ist.
'hello'.empty? # => false ' '.empty? # => false ''.empty? # => true
Verwandt: siehe Abfragen.
Source
static VALUE
str_encode(int argc, VALUE *argv, VALUE str)
{
VALUE newstr = str;
int encidx = str_transcode(argc, argv, &newstr);
return encoded_dup(newstr, str, encidx);
}
Gibt eine Kopie von self zurück, die gemäß dst_encoding transkodiert wurde; siehe Encodings.
Standardmäßig wird eine Ausnahme ausgelöst, wenn self ein ungültiges Byte oder ein Zeichen enthält, das nicht in dst_encoding definiert ist; dieses Verhalten kann durch Kodierungsoptionen geändert werden; siehe unten.
Ohne Argumente
-
Verwendet die gleiche Kodierung, wenn
Encoding.default_internalnil(Standard) ist.Encoding.default_internal # => nil s = "Ruby\x99".force_encoding('Windows-1252') s.encoding # => #<Encoding:Windows-1252> s.bytes # => [82, 117, 98, 121, 153] t = s.encode # => "Ruby\x99" t.encoding # => #<Encoding:Windows-1252> t.bytes # => [82, 117, 98, 121, 226, 132, 162]
-
Andernfalls wird die Kodierung
Encoding.default_internalverwendet.Encoding.default_internal = 'UTF-8' t = s.encode # => "Ruby™" t.encoding # => #<Encoding:UTF-8>
Nur mit dem Argument dst_encoding wird diese Kodierung verwendet.
s = "Ruby\x99".force_encoding('Windows-1252') s.encoding # => #<Encoding:Windows-1252> t = s.encode('UTF-8') # => "Ruby™" t.encoding # => #<Encoding:UTF-8>
Mit den Argumenten dst_encoding und src_encoding wird self mit src_encoding interpretiert und der neue String mit dst_encoding kodiert.
s = "Ruby\x99" t = s.encode('UTF-8', 'Windows-1252') # => "Ruby™" t.encoding # => #<Encoding:UTF-8>
Optionale Schlüsselwortargumente enc_opts geben Kodierungsoptionen an; siehe Encoding Options.
Bitte beachten Sie, dass die Konvertierung von einer Kodierung enc in dieselbe Kodierung enc (unabhängig davon, ob enc explizit oder implizit angegeben ist) eine No-Operation ist, d.h. der String wird einfach ohne Änderungen kopiert und es werden keine Ausnahmen ausgelöst, es sei denn, die Option invalid: :replace wird angegeben, auch wenn ungültige Bytes vorhanden sind.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
str_encode_bang(int argc, VALUE *argv, VALUE str)
{
VALUE newstr;
int encidx;
rb_check_frozen(str);
newstr = str;
encidx = str_transcode(argc, argv, &newstr);
if (encidx < 0) return str;
if (newstr == str) {
rb_enc_associate_index(str, encidx);
return str;
}
rb_str_shared_replace(str, newstr);
return str_encode_associate(str, encidx);
}
Wie encode, aber wendet Kodierungsänderungen auf self an; gibt self zurück.
Verwandt: siehe Modifizieren.
Source
VALUE
rb_obj_encoding(VALUE obj)
{
int idx = rb_enc_get_index(obj);
if (idx < 0) {
rb_raise(rb_eTypeError, "unknown encoding");
}
return rb_enc_from_encoding_index(idx & ENC_INDEX_MASK);
}
Source
static VALUE
rb_str_end_with(int argc, VALUE *argv, VALUE str)
{
int i;
for (i=0; i<argc; i++) {
VALUE tmp = argv[i];
const char *p, *s, *e;
long slen, tlen;
rb_encoding *enc;
StringValue(tmp);
enc = rb_enc_check(str, tmp);
if ((tlen = RSTRING_LEN(tmp)) == 0) return Qtrue;
if ((slen = RSTRING_LEN(str)) < tlen) continue;
p = RSTRING_PTR(str);
e = p + slen;
s = e - tlen;
if (!at_char_boundary(p, s, e, enc))
continue;
if (memcmp(s, RSTRING_PTR(tmp), tlen) == 0)
return Qtrue;
}
return Qfalse;
}
Gibt zurück, ob self mit einem der gegebenen strings endet.
'foo'.end_with?('oo') # => true 'foo'.end_with?('bar', 'oo') # => true 'foo'.end_with?('bar', 'baz') # => false 'foo'.end_with?('') # => true 'тест'.end_with?('т') # => true 'こんにちは'.end_with?('は') # => true
Verwandt: siehe Abfragen.
Source
VALUE
rb_str_eql(VALUE str1, VALUE str2)
{
if (str1 == str2) return Qtrue;
if (!RB_TYPE_P(str2, T_STRING)) return Qfalse;
return rb_str_eql_internal(str1, str2);
}
Gibt zurück, ob self und object die gleiche Länge und denselben Inhalt haben.
s = 'foo' s.eql?('foo') # => true s.eql?('food') # => false s.eql?('FOO') # => false
Gibt false zurück, wenn die Kodierungen der beiden Strings nicht kompatibel sind.
s0 = "äöü" # => "äöü" s1 = s0.encode(Encoding::ISO_8859_1) # => "\xE4\xF6\xFC" s0.encoding # => #<Encoding:UTF-8> s1.encoding # => #<Encoding:ISO-8859-1> s0.eql?(s1) # => false
Siehe Encodings.
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_force_encoding(VALUE str, VALUE enc)
{
str_modifiable(str);
rb_encoding *encoding = rb_to_encoding(enc);
int idx = rb_enc_to_index(encoding);
// If the encoding is unchanged, we do nothing.
if (ENCODING_GET(str) == idx) {
return str;
}
rb_enc_associate_index(str, idx);
// If the coderange was 7bit and the new encoding is ASCII-compatible
// we can keep the coderange.
if (ENC_CODERANGE(str) == ENC_CODERANGE_7BIT && encoding && rb_enc_asciicompat(encoding)) {
return str;
}
ENC_CODERANGE_CLEAR(str);
return str;
}
Ändert die Kodierung von self auf die gegebene encoding, die ein String-Kodierungsname oder ein Encoding-Objekt sein kann; ändert die zugrunde liegenden Bytes nicht; gibt self zurück.
s = 'łał' s.bytes # => [197, 130, 97, 197, 130] s.encoding # => #<Encoding:UTF-8> s.force_encoding('ascii') # => "\xC5\x82a\xC5\x82" s.encoding # => #<Encoding:US-ASCII> s.valid_encoding? # => true s.bytes # => [197, 130, 97, 197, 130]
Führt die Änderung auch dann durch, wenn die gegebene encoding für self ungültig ist (ebenso wie die obige Änderung).
s.valid_encoding? # => false
Siehe Encodings.
Verwandt: siehe Modifizieren.
Source
VALUE
rb_str_getbyte(VALUE str, VALUE index)
{
long pos = NUM2LONG(index);
if (pos < 0)
pos += RSTRING_LEN(str);
if (pos < 0 || RSTRING_LEN(str) <= pos)
return Qnil;
return INT2FIX((unsigned char)RSTRING_PTR(str)[pos]);
}
Gibt das Byte am 0-basierten index als ganze Zahl zurück.
s = 'foo' s.getbyte(0) # => 102 s.getbyte(1) # => 111 s.getbyte(2) # => 111
Zählt rückwärts vom Ende, wenn index negativ ist.
s.getbyte(-3) # => 102
Gibt nil zurück, wenn index außerhalb des Bereichs liegt.
s.getbyte(3) # => nil s.getbyte(-4) # => nil
Weitere Beispiele
s = 'тест' s.bytes # => [209, 130, 208, 181, 209, 129, 209, 130] s.getbyte(2) # => 208 s = 'こんにちは' s.bytes # => [227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175] s.getbyte(2) # => 147
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_grapheme_clusters(VALUE str)
{
VALUE ary = WANTARRAY("grapheme_clusters", rb_str_strlen(str));
return rb_str_enumerate_grapheme_clusters(str, ary);
}
Gibt ein Array der Graphem-Cluster in self zurück (siehe Unicode Grapheme Cluster Boundaries).
s = "ä-pqr-b̈-xyz-c̈" s.size # => 16 s.bytesize # => 19 s.grapheme_clusters.size # => 13 s.grapheme_clusters # => ["ä", "-", "p", "q", "r", "-", "b̈", "-", "x", "y", "z", "-", "c̈"]
Details
s = "ä" s.grapheme_clusters # => ["ä"] # One grapheme cluster. s.bytes # => [97, 204, 136] # Three bytes. s.chars # => ["a", "̈"] # Two characters. s.chars.map {|char| char.ord } # => [97, 776] # Their values.
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_gsub(int argc, VALUE *argv, VALUE str)
{
return str_gsub(argc, argv, str, 0);
}
Gibt eine Kopie von self zurück, bei der null oder mehr Teilstrings ersetzt wurden.
Das Argument pattern kann ein String oder ein Regexp sein; das Argument replacement kann ein String oder ein Hash sein. Unterschiedliche Typen für die Argumentwerte machen diese Methode sehr vielseitig.
Unten sind einige einfache Beispiele; für viele weitere Beispiele siehe Substitutionsmethoden.
Mit den Argumenten pattern und String replacement wird jeder übereinstimmende Teilstring durch den gegebenen replacement-String ersetzt.
s = 'abracadabra' s.gsub('ab', 'AB') # => "ABracadABra" s.gsub(/[a-c]/, 'X') # => "XXrXXXdXXrX"
Mit den Argumenten pattern und Hash replacement wird jeder übereinstimmende Teilstring durch einen Wert aus dem gegebenen replacement-Hash ersetzt oder entfernt.
h = {'a' => 'A', 'b' => 'B', 'c' => 'C'} s.gsub(/[a-c]/, h) # => "ABrACAdABrA" # 'a', 'b', 'c' replaced. s.gsub(/[a-d]/, h) # => "ABrACAABrA" # 'd' removed.
Mit dem Argument pattern und einem Block wird der Block mit jedem übereinstimmenden Teilstring aufgerufen; dieser Teilstring wird durch den Rückgabewert des Blocks ersetzt.
s.gsub(/[a-d]/) {|substring| substring.upcase } # => "ABrACADABrA"
Mit dem Argument pattern und ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_gsub_bang(int argc, VALUE *argv, VALUE str)
{
str_modify_keep_cr(str);
return str_gsub(argc, argv, str, 1);
}
Wie String#gsub, außer dass
-
Substitutionen in
self(nicht in einer Kopie vonself) durchgeführt werden. -
selfzurückgegeben wird, wenn Zeichen entfernt werden, andernfallsnil.
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_hash_m(VALUE str)
{
st_index_t hval = rb_str_hash(str);
return ST2FIX(hval);
}
Gibt den ganzzahligen Hash-Wert für self zurück.
Zwei String-Objekte mit identischem Inhalt und kompatiblen Kodierungen haben auch denselben Hash-Wert; siehe Object#hash und Encodings.
s = 'foo' h = s.hash # => -569050784 h == 'foo'.hash # => true h == 'food'.hash # => false h == 'FOO'.hash # => false s0 = "äöü" s1 = s0.encode(Encoding::ISO_8859_1) s0.encoding # => #<Encoding:UTF-8> s1.encoding # => #<Encoding:ISO-8859-1> s0.hash == s1.hash # => false
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_hex(VALUE str)
{
return rb_str_to_inum(str, 16, FALSE);
}
Interpretiert den führenden Teilstring von self als Hexadezimalzahl, möglicherweise mit Vorzeichen; gibt dessen Wert als ganze Zahl zurück.
Der führende Teilstring wird als Hexadezimalzahl interpretiert, wenn er beginnt mit
-
Einem oder mehreren Zeichen, die Hexadezimalziffern darstellen (jeweils im Bereich
'0'..'9','a'..'f'oder'A'..'F'); der zu interpretierende String endet beim ersten Zeichen, das keine Hexadezimalziffer darstellt.'f'.hex # => 15 '11'.hex # => 17 'FFF'.hex # => 4095 'fffg'.hex # => 4095 'foo'.hex # => 15 # 'f' hexadecimal, 'oo' not. 'bar'.hex # => 186 # 'ba' hexadecimal, 'r' not. 'deadbeef'.hex # => 3735928559
-
'0x'oder'0X', gefolgt von einer oder mehreren Hexadezimalziffern.'0xfff'.hex # => 4095 '0xfffg'.hex # => 4095
Jede der obigen Formen kann mit einem '-' präfigiert werden, das den interpretierten Wert negiert.
'-fff'.hex # => -4095 '-0xFFF'.hex # => -4095
Für jeden Teilstring, der nicht oben beschrieben ist, wird Null zurückgegeben.
'xxx'.hex # => 0 ''.hex # => 0
Beachten Sie, dass diese Methode im Gegensatz zu oct nur Hexadezimalnotationen und keine Binär-, Oktal- oder Dezimalnotationen interpretiert.
'0b111'.hex # => 45329 '0o777'.hex # => 0 '0d999'.hex # => 55705
Verwandt: Siehe Konvertierung in Nicht-String.
Source
VALUE
rb_str_include(VALUE str, VALUE arg)
{
long i;
StringValue(arg);
i = rb_str_index(str, arg, 0);
return RBOOL(i != -1);
}
Gibt zurück, ob self other_string enthält.
s = 'bar' s.include?('ba') # => true s.include?('ar') # => true s.include?('bar') # => true s.include?('a') # => true s.include?('') # => true s.include?('foo') # => false
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_index_m(int argc, VALUE *argv, VALUE str)
{
VALUE sub;
VALUE initpos;
rb_encoding *enc = STR_ENC_GET(str);
long pos;
if (rb_scan_args(argc, argv, "11", &sub, &initpos) == 2) {
long slen = str_strlen(str, enc); /* str's enc */
pos = NUM2LONG(initpos);
if (pos < 0 ? (pos += slen) < 0 : pos > slen) {
if (RB_TYPE_P(sub, T_REGEXP)) {
rb_backref_set(Qnil);
}
return Qnil;
}
}
else {
pos = 0;
}
if (RB_TYPE_P(sub, T_REGEXP)) {
pos = str_offset(RSTRING_PTR(str), RSTRING_END(str), pos,
enc, single_byte_optimizable(str));
if (rb_reg_search(sub, str, pos, 0) >= 0) {
VALUE match = rb_backref_get();
struct re_registers *regs = RMATCH_REGS(match);
pos = rb_str_sublen(str, BEG(0));
return LONG2NUM(pos);
}
}
else {
StringValue(sub);
pos = rb_str_index(str, sub, pos);
if (pos >= 0) {
pos = rb_str_sublen(str, pos);
return LONG2NUM(pos);
}
}
return Qnil;
}
Gibt die ganzzahlige Position des ersten Teilstrings zurück, der dem gegebenen Argument pattern entspricht, oder nil, wenn keiner gefunden wurde.
Wenn pattern ein String ist, wird der Index des ersten übereinstimmenden Teilstrings in self zurückgegeben.
'foo'.index('f') # => 0 'foo'.index('o') # => 1 'foo'.index('oo') # => 1 'foo'.index('ooo') # => nil 'тест'.index('с') # => 2 # Characters, not bytes. 'こんにちは'.index('ち') # => 3
Wenn pattern ein Regexp ist, wird der Index der ersten Übereinstimmung in self zurückgegeben.
'foo'.index(/o./) # => 1 'foo'.index(/.o/) # => 0
Wenn offset nicht-negativ ist, beginnt die Suche an Position offset; der zurückgegebene Index ist relativ zum Anfang von self.
'bar'.index('r', 0) # => 2 'bar'.index('r', 1) # => 2 'bar'.index('r', 2) # => 2 'bar'.index('r', 3) # => nil 'bar'.index(/[r-z]/, 0) # => 2 'тест'.index('с', 1) # => 2 'тест'.index('с', 2) # => 2 'тест'.index('с', 3) # => nil # Offset in characters, not bytes. 'こんにちは'.index('ち', 2) # => 3
Mit einem negativen ganzzahligen Argument offset wird die Suchposition durch Rückwärtszählen vom Ende von self ausgewählt.
'foo'.index('o', -1) # => 2 'foo'.index('o', -2) # => 1 'foo'.index('o', -3) # => 1 'foo'.index('o', -4) # => nil 'foo'.index(/o./, -2) # => 1 'foo'.index(/.o/, -2) # => 1
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_insert(VALUE str, VALUE idx, VALUE str2)
{
long pos = NUM2LONG(idx);
if (pos == -1) {
return rb_str_append(str, str2);
}
else if (pos < 0) {
pos++;
}
rb_str_update(str, pos, 0, str2);
return str;
}
Fügt den gegebenen other_string in self ein; gibt self zurück.
Wenn der gegebene index nicht-negativ ist, wird other_string an Offset index eingefügt.
'foo'.insert(0, 'bar') # => "barfoo" 'foo'.insert(1, 'bar') # => "fbaroo" 'foo'.insert(3, 'bar') # => "foobar" 'тест'.insert(2, 'bar') # => "теbarст" # Characters, not bytes. 'こんにちは'.insert(2, 'bar') # => "こんbarにちは"
Wenn der index negativ ist, wird vom Ende von self rückwärts gezählt und other_string *nach* dem Offset eingefügt.
'foo'.insert(-2, 'bar') # => "fobaro"
Verwandt: siehe Modifizieren.
Source
VALUE
rb_str_inspect(VALUE str)
{
int encidx = ENCODING_GET(str);
rb_encoding *enc = rb_enc_from_index(encidx);
const char *p, *pend, *prev;
char buf[CHAR_ESC_LEN + 1];
VALUE result = rb_str_buf_new(0);
rb_encoding *resenc = rb_default_internal_encoding();
int unicode_p = rb_enc_unicode_p(enc);
int asciicompat = rb_enc_asciicompat(enc);
if (resenc == NULL) resenc = rb_default_external_encoding();
if (!rb_enc_asciicompat(resenc)) resenc = rb_usascii_encoding();
rb_enc_associate(result, resenc);
str_buf_cat2(result, "\"");
p = RSTRING_PTR(str); pend = RSTRING_END(str);
prev = p;
while (p < pend) {
unsigned int c, cc;
int n;
n = rb_enc_precise_mbclen(p, pend, enc);
if (!MBCLEN_CHARFOUND_P(n)) {
if (p > prev) str_buf_cat(result, prev, p - prev);
n = rb_enc_mbminlen(enc);
if (pend < p + n)
n = (int)(pend - p);
while (n--) {
snprintf(buf, CHAR_ESC_LEN, "\\x%02X", *p & 0377);
str_buf_cat(result, buf, strlen(buf));
prev = ++p;
}
continue;
}
n = MBCLEN_CHARFOUND_LEN(n);
c = rb_enc_mbc_to_codepoint(p, pend, enc);
p += n;
if ((asciicompat || unicode_p) &&
(c == '"'|| c == '\\' ||
(c == '#' &&
p < pend &&
MBCLEN_CHARFOUND_P(rb_enc_precise_mbclen(p,pend,enc)) &&
(cc = rb_enc_codepoint(p,pend,enc),
(cc == '$' || cc == '@' || cc == '{'))))) {
if (p - n > prev) str_buf_cat(result, prev, p - n - prev);
str_buf_cat2(result, "\\");
if (asciicompat || enc == resenc) {
prev = p - n;
continue;
}
}
switch (c) {
case '\n': cc = 'n'; break;
case '\r': cc = 'r'; break;
case '\t': cc = 't'; break;
case '\f': cc = 'f'; break;
case '\013': cc = 'v'; break;
case '\010': cc = 'b'; break;
case '\007': cc = 'a'; break;
case 033: cc = 'e'; break;
default: cc = 0; break;
}
if (cc) {
if (p - n > prev) str_buf_cat(result, prev, p - n - prev);
buf[0] = '\\';
buf[1] = (char)cc;
str_buf_cat(result, buf, 2);
prev = p;
continue;
}
/* The special casing of 0x85 (NEXT_LINE) here is because
* Oniguruma historically treats it as printable, but it
* doesn't match the print POSIX bracket class or character
* property in regexps.
*
* See Ruby Bug #16842 for details:
* https://bugs.ruby-lang.org/issues/16842
*/
if ((enc == resenc && rb_enc_isprint(c, enc) && c != 0x85) ||
(asciicompat && rb_enc_isascii(c, enc) && ISPRINT(c))) {
continue;
}
else {
if (p - n > prev) str_buf_cat(result, prev, p - n - prev);
rb_str_buf_cat_escaped_char(result, c, unicode_p);
prev = p;
continue;
}
}
if (p > prev) str_buf_cat(result, prev, p - prev);
str_buf_cat2(result, "\"");
return result;
}
Gibt eine druckbare Version von self zurück, eingeschlossen in doppelte Anführungszeichen.
Die meisten druckbaren Zeichen werden einfach als sie selbst wiedergegeben.
'abc'.inspect # => "\"abc\"" '012'.inspect # => "\"012\"" ''.inspect # => "\"\"" "\u000012".inspect # => "\"\\u000012\"" 'тест'.inspect # => "\"тест\"" 'こんにちは'.inspect # => "\"こんにちは\""
Aber die druckbaren Zeichen doppelte Anführungszeichen ('"') und Backslash ('\') werden escaped.
'"'.inspect # => "\"\\\"\"" '\\'.inspect # => "\"\\\\\""
Nicht druckbare Zeichen sind die ASCII-Zeichen, deren Werte im Bereich 0..31 liegen, zusammen mit dem Zeichen, dessen Wert 127 ist.
Die meisten dieser Zeichen werden so wiedergegeben:
0.chr.inspect # => "\"\\x00\"" 1.chr.inspect # => "\"\\x01\"" 2.chr.inspect # => "\"\\x02\"" # ...
Einige wenige haben jedoch spezielle Darstellungen.
7.chr.inspect # => "\"\\a\"" # BEL 8.chr.inspect # => "\"\\b\"" # BS 9.chr.inspect # => "\"\\t\"" # TAB 10.chr.inspect # => "\"\\n\"" # LF 11.chr.inspect # => "\"\\v\"" # VT 12.chr.inspect # => "\"\\f\"" # FF 13.chr.inspect # => "\"\\r\"" # CR 27.chr.inspect # => "\"\\e\"" # ESC
Verwandt: siehe Konvertierung in Nicht-String.
Source
VALUE
rb_str_intern(VALUE str)
{
return sym_find_or_insert_dynamic_symbol(&ruby_global_symbols, str);
}
Gibt das von self abgeleitete Symbol-Objekt zurück und erstellt es, falls es noch nicht existiert.
'foo'.intern # => :foo 'тест'.intern # => :тест 'こんにちは'.intern # => :こんにちは
Verwandt: siehe Konvertierung in Nicht-String.
Source
VALUE
rb_str_length(VALUE str)
{
return LONG2NUM(str_strlen(str, NULL));
}
Gibt die Anzahl der Zeichen (nicht Bytes) in self zurück.
'foo'.length # => 3 'тест'.length # => 4 'こんにちは'.length # => 5
Im Gegensatz zu String#bytesize.
'foo'.bytesize # => 3 'тест'.bytesize # => 8 'こんにちは'.bytesize # => 15
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_lines(int argc, VALUE *argv, VALUE str)
{
VALUE ary = WANTARRAY("lines", 0);
return rb_str_enumerate_lines(argc, argv, str, ary);
}
Gibt Teilstrings ("Zeilen") von self gemäß den gegebenen Argumenten zurück.
s = <<~EOT This is the first line. This is line two. This is line four. This is line five. EOT
Mit den Standard-Argumentwerten.
$/ # => "\n" s.lines # => ["This is the first line.\n", "This is line two.\n", "\n", "This is line four.\n", "This is line five.\n"]
Mit einem anderen record_separator
record_separator = ' is ' s.lines(record_separator) # => ["This is ", "the first line.\nThis is ", "line two.\n\nThis is ", "line four.\nThis is ", "line five.\n"]
Mit dem Schlüsselwortargument chomp als true wird der nachfolgende Zeilentrenner von jeder Zeile entfernt.
s.lines(chomp: true) # => ["This is the first line.", "This is line two.", "", "This is line four.", "This is line five."]
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_ljust(int argc, VALUE *argv, VALUE str)
{
return rb_str_justify(argc, argv, str, 'l');
}
Gibt eine Kopie von self zurück, linksbündig und bei Bedarf rechts mit pad_string aufgefüllt.
'hello'.ljust(10) # => "hello " ' hello'.ljust(10) # => " hello " 'hello'.ljust(10, 'ab') # => "helloababa" 'тест'.ljust(10) # => "тест " 'こんにちは'.ljust(10) # => "こんにちは "
Wenn width <= self.length, wird eine Kopie von self zurückgegeben.
'hello'.ljust(5) # => "hello" 'hello'.ljust(1) # => "hello" # Does not truncate to width.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_lstrip(int argc, VALUE *argv, VALUE str)
{
char *start;
long len, loffset;
RSTRING_GETMEM(str, start, len);
if (argc > 0) {
char table[TR_TABLE_SIZE];
VALUE del = 0, nodel = 0;
tr_setup_table_multi(table, &del, &nodel, str, argc, argv);
loffset = lstrip_offset_table(str, start, start+len, STR_ENC_GET(str), table, del, nodel);
}
else {
loffset = lstrip_offset(str, start, start+len, STR_ENC_GET(str));
}
if (loffset <= 0) return str_duplicate(rb_cString, str);
return rb_str_subseq(str, loffset, len - loffset);
}
Gibt eine Kopie von self zurück, bei der führende Leerzeichen entfernt wurden; siehe Leerzeichen in Strings.
whitespace = "\x00\t\n\v\f\r " s = whitespace + 'abc' + whitespace # => "\u0000\t\n\v\f\r abc\u0000\t\n\v\f\r " s.lstrip # => "abc\u0000\t\n\v\f\r "
Wenn selectors angegeben sind, werden Zeichen aus selectors vom Anfang von self entfernt.
s = "---abc+++" s.lstrip("-") # => "abc+++"
selectors müssen gültige Zeichenselektoren sein (siehe Character Selectors) und können jede seiner gültigen Formen verwenden, einschließlich Negation, Bereiche und Escapes.
"01234abc56789".lstrip("0-9") # "abc56789" "01234abc56789".lstrip("0-9", "^4-6") # "4abc56789"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_lstrip_bang(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
char *start, *s;
long olen, loffset;
str_modify_keep_cr(str);
enc = STR_ENC_GET(str);
RSTRING_GETMEM(str, start, olen);
if (argc > 0) {
char table[TR_TABLE_SIZE];
VALUE del = 0, nodel = 0;
tr_setup_table_multi(table, &del, &nodel, str, argc, argv);
loffset = lstrip_offset_table(str, start, start+olen, enc, table, del, nodel);
}
else {
loffset = lstrip_offset(str, start, start+olen, enc);
}
if (loffset > 0) {
long len = olen-loffset;
s = start + loffset;
memmove(start, s, len);
STR_SET_LEN(str, len);
TERM_FILL(start+len, rb_enc_mbminlen(enc));
return str;
}
return Qnil;
}
Wie String#lstrip, außer dass
-
das Strippen in
self(nicht in einer Kopie vonself) durchgeführt wird. -
Gibt
selfzurück, wenn Zeichen gestrippt wurden, andernfallsnil.
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_match_m(int argc, VALUE *argv, VALUE str)
{
VALUE re, result;
if (argc < 1)
rb_check_arity(argc, 1, 2);
re = argv[0];
argv[0] = str;
result = rb_funcallv(get_pat(re), rb_intern("match"), argc, argv);
if (!NIL_P(result) && rb_block_given_p()) {
return rb_yield(result);
}
return result;
}
Erstellt ein MatchData-Objekt basierend auf self und den gegebenen Argumenten; aktualisiert Regexp Global Variables.
-
Berechnet
regexp, indempatternkonvertiert wird (falls nicht bereits einRegexp).regexp = Regexp.new(pattern)
-
Berechnet
matchdata, das entweder einMatchData-Objekt odernilsein wird (sieheRegexp#match).matchdata = regexp.match(self[offset..])
Ohne Block wird das berechnete matchdata oder nil zurückgegeben.
'foo'.match('f') # => #<MatchData "f"> 'foo'.match('o') # => #<MatchData "o"> 'foo'.match('x') # => nil 'foo'.match('f', 1) # => nil 'foo'.match('o', 1) # => #<MatchData "o">
Mit einem Block und nicht-nil berechnetem matchdata wird der Block mit matchdata aufgerufen; gibt den Rückgabewert des Blocks zurück.
'foo'.match(/o/) {|matchdata| matchdata } # => #<MatchData "o">
Mit einem Block und nil matchdata wird der Block nicht aufgerufen.
'foo'.match(/x/) {|matchdata| fail 'Cannot happen' } # => nil
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_match_m_p(int argc, VALUE *argv, VALUE str)
{
VALUE re;
rb_check_arity(argc, 1, 2);
re = get_pat(argv[0]);
return rb_reg_match_p(re, str, argc > 1 ? NUM2LONG(argv[1]) : 0);
}
Gibt zurück, ob eine Übereinstimmung für self und die gegebenen Argumente gefunden wird; aktualisiert keine Regexp Global Variables.
Berechnet regexp, indem pattern konvertiert wird (falls nicht bereits ein Regexp).
regexp = Regexp.new(pattern)
Gibt true zurück, wenn self[offset..].match(regexp) ein MatchData-Objekt zurückgibt, andernfalls false
'foo'.match?(/o/) # => true 'foo'.match?('o') # => true 'foo'.match?(/x/) # => false 'foo'.match?('f', 1) # => false 'foo'.match?('o', 1) # => true
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_oct(VALUE str)
{
return rb_str_to_inum(str, -8, FALSE);
}
Interpretiert die führende Teilzeichenkette von self als Oktal-, Binär-, Dezimal- oder Hexadezimalzahl, möglicherweise vorzeichenbehaftet; gibt deren Wert als Ganzzahl zurück.
Kurz gesagt
# Interpreted as octal. '777'.oct # => 511 '777x'.oct # => 511 '0777'.oct # => 511 '0o777'.oct # => 511 '-777'.oct # => -511 # Not interpreted as octal. '0b111'.oct # => 7 # Interpreted as binary. '0d999'.oct # => 999 # Interpreted as decimal. '0xfff'.oct # => 4095 # Interpreted as hexadecimal.
Die führende Teilzeichenkette wird als Oktalzahl interpretiert, wenn sie beginnt mit
-
Ein oder mehrere Zeichen, die Oktalziffern darstellen (jede im Bereich
'0'..'7'); die zu interpretierende Zeichenkette endet beim ersten Zeichen, das keine Oktalldifferenz darstellt'7'.oct @ => 7 '11'.oct # => 9 '777'.oct # => 511 '0777'.oct # => 511 '7778'.oct # => 511 '777x'.oct # => 511
-
'0o', gefolgt von einer oder mehreren Oktalziffern'0o777'.oct # => 511 '0o7778'.oct # => 511
Die führende Teilzeichenkette wird *nicht* als Oktalzahl interpretiert, wenn sie beginnt mit
-
'0b', gefolgt von einem oder mehreren Zeichen, die Binärziffern darstellen (jede im Bereich'0'..'1'); die zu interpretierende Zeichenkette endet beim ersten Zeichen, das keine Binärziffer darstellt. Die Zeichenkette wird als Binärziffern (Basis 2) interpretiert'0b111'.oct # => 7 '0b1112'.oct # => 7
-
'0d', gefolgt von einer oder mehreren Zeichen, die Dezimalziffern darstellen (jede im Bereich'0'..'9'); die zu interpretierende Zeichenkette endet beim ersten Zeichen, das keine Dezimalziffer darstellt. Die Zeichenkette wird als Dezimalziffern (Basis 10) interpretiert'0d999'.oct # => 999 '0d999x'.oct # => 999
-
'0x', gefolgt von einer oder mehreren Zeichen, die Hexadezimalziffern darstellen (jede im Bereich'0'..'9','a'..'f'oder'A'..'F'); die zu interpretierende Zeichenkette endet beim ersten Zeichen, das keine Hexadezimalziffer darstellt. Die Zeichenkette wird als Hexadezimalziffern (Basis 16) interpretiert'0xfff'.oct # => 4095 '0xfffg'.oct # => 4095
Jede der obigen Formen kann mit einem '-' präfigiert werden, das den interpretierten Wert negiert.
'-777'.oct # => -511 '-0777'.oct # => -511 '-0b111'.oct # => -7 '-0xfff'.oct # => -4095
Für jeden Teilstring, der nicht oben beschrieben ist, wird Null zurückgegeben.
'foo'.oct # => 0 ''.oct # => 0
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_ord(VALUE s)
{
unsigned int c;
c = rb_enc_codepoint(RSTRING_PTR(s), RSTRING_END(s), STR_ENC_GET(s));
return UINT2NUM(c);
}
Gibt die ganzzahlige Ordnung des ersten Zeichens von self zurück
'h'.ord # => 104 'hello'.ord # => 104 'тест'.ord # => 1090 'こんにちは'.ord # => 12371
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_partition(VALUE str, VALUE sep)
{
long pos;
sep = get_pat_quoted(sep, 0);
if (RB_TYPE_P(sep, T_REGEXP)) {
if (rb_reg_search(sep, str, 0, 0) < 0) {
goto failed;
}
VALUE match = rb_backref_get();
struct re_registers *regs = RMATCH_REGS(match);
pos = BEG(0);
sep = rb_str_subseq(str, pos, END(0) - pos);
}
else {
pos = rb_str_index(str, sep, 0);
if (pos < 0) goto failed;
}
return rb_ary_new3(3, rb_str_subseq(str, 0, pos),
sep,
rb_str_subseq(str, pos+RSTRING_LEN(sep),
RSTRING_LEN(str)-pos-RSTRING_LEN(sep)));
failed:
return rb_ary_new3(3, str_duplicate(rb_cString, str), str_new_empty_String(str), str_new_empty_String(str));
}
Gibt ein Array mit 3 Teilzeichenketten von self zurück.
Wenn pattern übereinstimmt, wird das Array zurückgegeben
[pre_match, first_match, post_match]
wobei
-
first_matchdie erste gefundene übereinstimmende Teilzeichenkette ist. -
pre_matchundpost_matchdie vorhergehende und nachfolgende Teilzeichenkette sind.
Wenn pattern nicht übereinstimmt, wird das Array zurückgegeben
[self.dup, "", ""]
Beachten Sie, dass in den folgenden Beispielen eine zurückgegebene Zeichenkette 'hello' eine Kopie von self ist, nicht self.
Wenn pattern ein Regexp ist, wird das Äquivalent von self.match(pattern) ausgeführt (wobei auch Matched-Data-Variablen gesetzt werden)
'hello'.partition(/h/) # => ["", "h", "ello"] 'hello'.partition(/l/) # => ["he", "l", "lo"] 'hello'.partition(/l+/) # => ["he", "ll", "o"] 'hello'.partition(/o/) # => ["hell", "o", ""] 'hello'.partition(/^/) # => ["", "", "hello"] 'hello'.partition(//) # => ["", "", "hello"] 'hello'.partition(/$/) # => ["hello", "", ""] 'hello'.partition(/x/) # => ["hello", "", ""]
Wenn pattern kein Regexp ist, wird es in eine Zeichenkette umgewandelt (falls es nicht bereits eine ist) und dann das Äquivalent von self.index(pattern) ausgeführt (und es werden *keine* Matched-Data-Globalvariablen gesetzt)
'hello'.partition('h') # => ["", "h", "ello"] 'hello'.partition('l') # => ["he", "l", "lo"] 'hello'.partition('ll') # => ["he", "ll", "o"] 'hello'.partition('o') # => ["hell", "o", ""] 'hello'.partition('') # => ["", "", "hello"] 'hello'.partition('x') # => ["hello", "", ""] 'тест'.partition('т') # => ["", "т", "ест"] 'こんにちは'.partition('に') # => ["こん", "に", "ちは"]
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_prepend_multi(int argc, VALUE *argv, VALUE str)
{
str_modifiable(str);
if (argc == 1) {
rb_str_update(str, 0L, 0L, argv[0]);
}
else if (argc > 1) {
int i;
VALUE arg_str = rb_str_tmp_new(0);
rb_enc_copy(arg_str, str);
for (i = 0; i < argc; i++) {
rb_str_append(arg_str, argv[i]);
}
rb_str_update(str, 0L, 0L, arg_str);
}
return str;
}
Fügt der Verkettung der gegebenen other_strings vor self an; gibt self zurück
'baz'.prepend('foo', 'bar') # => "foobarbaz"
Verwandt: siehe Modifizieren.
Source
VALUE
rb_str_replace(VALUE str, VALUE str2)
{
str_modifiable(str);
if (str == str2) return str;
StringValue(str2);
str_discard(str);
return str_replace(str, str2);
}
Ersetzt den Inhalt von self durch den Inhalt von other_string; gibt self zurück
s = 'foo' # => "foo" s.replace('bar') # => "bar"
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_reverse(VALUE str)
{
rb_encoding *enc;
VALUE rev;
char *s, *e, *p;
int cr;
if (RSTRING_LEN(str) <= 1) return str_duplicate(rb_cString, str);
enc = STR_ENC_GET(str);
rev = rb_str_new(0, RSTRING_LEN(str));
s = RSTRING_PTR(str); e = RSTRING_END(str);
p = RSTRING_END(rev);
cr = ENC_CODERANGE(str);
if (RSTRING_LEN(str) > 1) {
if (single_byte_optimizable(str)) {
while (s < e) {
*--p = *s++;
}
}
else if (cr == ENC_CODERANGE_VALID) {
while (s < e) {
int clen = rb_enc_fast_mbclen(s, e, enc);
p -= clen;
memcpy(p, s, clen);
s += clen;
}
}
else {
cr = rb_enc_asciicompat(enc) ?
ENC_CODERANGE_7BIT : ENC_CODERANGE_VALID;
while (s < e) {
int clen = rb_enc_mbclen(s, e, enc);
if (clen > 1 || (*s & 0x80)) cr = ENC_CODERANGE_UNKNOWN;
p -= clen;
memcpy(p, s, clen);
s += clen;
}
}
}
STR_SET_LEN(rev, RSTRING_LEN(str));
str_enc_copy_direct(rev, str);
ENC_CODERANGE_SET(rev, cr);
return rev;
}
Gibt eine neue Zeichenkette mit den Zeichen von self in umgekehrter Reihenfolge zurück.
'drawer'.reverse # => "reward" 'reviled'.reverse # => "deliver" 'stressed'.reverse # => "desserts" 'semordnilaps'.reverse # => "spalindromes"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_reverse_bang(VALUE str)
{
if (RSTRING_LEN(str) > 1) {
if (single_byte_optimizable(str)) {
char *s, *e, c;
str_modify_keep_cr(str);
s = RSTRING_PTR(str);
e = RSTRING_END(str) - 1;
while (s < e) {
c = *s;
*s++ = *e;
*e-- = c;
}
}
else {
str_shared_replace(str, rb_str_reverse(str));
}
}
else {
str_modify_keep_cr(str);
}
return str;
}
Gibt self mit umgedrehten Zeichen zurück
'drawer'.reverse! # => "reward" 'reviled'.reverse! # => "deliver" 'stressed'.reverse! # => "desserts" 'semordnilaps'.reverse! # => "spalindromes"
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_rindex_m(int argc, VALUE *argv, VALUE str)
{
VALUE sub;
VALUE initpos;
rb_encoding *enc = STR_ENC_GET(str);
long pos, len = str_strlen(str, enc); /* str's enc */
if (rb_scan_args(argc, argv, "11", &sub, &initpos) == 2) {
pos = NUM2LONG(initpos);
if (pos < 0 && (pos += len) < 0) {
if (RB_TYPE_P(sub, T_REGEXP)) {
rb_backref_set(Qnil);
}
return Qnil;
}
if (pos > len) pos = len;
}
else {
pos = len;
}
if (RB_TYPE_P(sub, T_REGEXP)) {
/* enc = rb_enc_check(str, sub); */
pos = str_offset(RSTRING_PTR(str), RSTRING_END(str), pos,
enc, single_byte_optimizable(str));
if (rb_reg_search(sub, str, pos, 1) >= 0) {
VALUE match = rb_backref_get();
struct re_registers *regs = RMATCH_REGS(match);
pos = rb_str_sublen(str, BEG(0));
return LONG2NUM(pos);
}
}
else {
StringValue(sub);
pos = rb_str_rindex(str, sub, pos);
if (pos >= 0) {
pos = rb_str_sublen(str, pos);
return LONG2NUM(pos);
}
}
return Qnil;
}
Gibt die ganzzahlige Position der *letzten* Teilzeichenkette zurück, die mit dem gegebenen Argument pattern übereinstimmt, oder nil, wenn keine gefunden wird.
Wenn pattern eine Zeichenkette ist, wird der Index der letzten übereinstimmenden Teilzeichenkette in self zurückgegeben
'foo'.rindex('f') # => 0
'foo'.rindex('o') # => 2
'foo'.rindex('oo' # => 1
'foo'.rindex('ooo') # => nil
'тест'.rindex('т') # => 3
'こんにちは'.rindex('ち') # => 3
Wenn pattern ein Regexp ist, wird der Index des letzten Treffers in self zurückgegeben
'foo'.rindex(/f/) # => 0 'foo'.rindex(/o/) # => 2 'foo'.rindex(/oo/) # => 1 'foo'.rindex(/ooo/) # => nil
Wenn offset nicht negativ ist, gibt es die maximale Startposition in der Zeichenkette an, an der die Suche beendet werden soll
'foo'.rindex('o', 0) # => nil 'foo'.rindex('o', 1) # => 1 'foo'.rindex('o', 2) # => 2 'foo'.rindex('o', 3) # => 2
Mit einem negativen ganzzahligen Argument offset wird die Suchposition durch Rückwärtszählen vom Ende von self ausgewählt.
'foo'.rindex('o', -1) # => 2 'foo'.rindex('o', -2) # => 1 'foo'.rindex('o', -3) # => nil 'foo'.rindex('o', -4) # => nil
Der letzte Treffer bedeutet, dass an der zuletzt möglichen Position begonnen wird, nicht der letzte der längsten Treffer
'foo'.rindex(/o+/) # => 2 $~ # => #<MatchData "o">
Um den letzten längsten Treffer zu erhalten, kombinieren Sie mit negativer Lookbehind-Assertion
'foo'.rindex(/(?<!o)o+/) # => 1 $~ # => #<MatchData "oo">
Oder String#index mit negativer Lookforward-Assertion.
'foo'.index(/o+(?!.*o)/) # => 1 $~ # => #<MatchData "oo">
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_rjust(int argc, VALUE *argv, VALUE str)
{
return rb_str_justify(argc, argv, str, 'r');
}
Gibt eine rechtsbündige Kopie von self zurück.
Wenn das Ganzzahlargument width größer ist als die Größe (in Zeichen) von self, wird eine neue Zeichenkette der Länge width zurückgegeben, die eine Kopie von self ist, rechtsbündig und links mit pad_string aufgefüllt
'hello'.rjust(10) # => " hello" 'hello '.rjust(10) # => " hello " 'hello'.rjust(10, 'ab') # => "ababahello" 'тест'.rjust(10) # => " тест" 'こんにちは'.rjust(10) # => " こんにちは"
Wenn width <= self.size, wird eine Kopie von self zurückgegeben
'hello'.rjust(5, 'ab') # => "hello" 'hello'.rjust(1, 'ab') # => "hello"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_rpartition(VALUE str, VALUE sep)
{
long pos = RSTRING_LEN(str);
sep = get_pat_quoted(sep, 0);
if (RB_TYPE_P(sep, T_REGEXP)) {
if (rb_reg_search(sep, str, pos, 1) < 0) {
goto failed;
}
VALUE match = rb_backref_get();
struct re_registers *regs = RMATCH_REGS(match);
pos = BEG(0);
sep = rb_str_subseq(str, pos, END(0) - pos);
}
else {
pos = rb_str_sublen(str, pos);
pos = rb_str_rindex(str, sep, pos);
if (pos < 0) {
goto failed;
}
}
return rb_ary_new3(3, rb_str_subseq(str, 0, pos),
sep,
rb_str_subseq(str, pos+RSTRING_LEN(sep),
RSTRING_LEN(str)-pos-RSTRING_LEN(sep)));
failed:
return rb_ary_new3(3, str_new_empty_String(str), str_new_empty_String(str), str_duplicate(rb_cString, str));
}
Gibt ein Array mit 3 Teilzeichenketten von self zurück.
Sucht in self nach einem Treffer von pattern, wobei der *letzte* Treffer gesucht wird.
Wenn pattern nicht übereinstimmt, wird das Array zurückgegeben
["", "", self.dup]
Wenn pattern übereinstimmt, wird das Array zurückgegeben
[pre_match, last_match, post_match]
wobei
-
last_matchist die zuletzt gefundene übereinstimmende Teilzeichenkette. -
pre_matchundpost_matchdie vorhergehende und nachfolgende Teilzeichenkette sind.
Das verwendete Muster ist
-
patternselbst, wenn es einRegexpist. -
Regexp.quote(pattern), wennpatterneine Zeichenkette ist.
Beachten Sie, dass in den folgenden Beispielen eine zurückgegebene Zeichenkette 'hello' eine Kopie von self ist, nicht self.
Wenn pattern ein Regexp ist, wird nach der letzten übereinstimmenden Teilzeichenkette gesucht (wobei auch Matched-Data-Globalvariablen gesetzt werden)
'hello'.rpartition(/l/) # => ["hel", "l", "o"] 'hello'.rpartition(/ll/) # => ["he", "ll", "o"] 'hello'.rpartition(/h/) # => ["", "h", "ello"] 'hello'.rpartition(/o/) # => ["hell", "o", ""] 'hello'.rpartition(//) # => ["hello", "", ""] 'hello'.rpartition(/x/) # => ["", "", "hello"] 'тест'.rpartition(/т/) # => ["тес", "т", ""] 'こんにちは'.rpartition(/に/) # => ["こん", "に", "ちは"]
Wenn pattern kein Regexp ist, wird es in eine Zeichenkette umgewandelt (falls es nicht bereits eine ist) und dann nach der letzten übereinstimmenden Teilzeichenkette gesucht (und es werden *keine* Matched-Data-Globalvariablen gesetzt)
'hello'.rpartition('l') # => ["hel", "l", "o"] 'hello'.rpartition('ll') # => ["he", "ll", "o"] 'hello'.rpartition('h') # => ["", "h", "ello"] 'hello'.rpartition('o') # => ["hell", "o", ""] 'hello'.rpartition('') # => ["hello", "", ""] 'тест'.rpartition('т') # => ["тес", "т", ""] 'こんにちは'.rpartition('に') # => ["こん", "に", "ちは"]
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_rstrip(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
char *start;
long olen, roffset;
enc = STR_ENC_GET(str);
RSTRING_GETMEM(str, start, olen);
if (argc > 0) {
char table[TR_TABLE_SIZE];
VALUE del = 0, nodel = 0;
tr_setup_table_multi(table, &del, &nodel, str, argc, argv);
roffset = rstrip_offset_table(str, start, start+olen, enc, table, del, nodel);
}
else {
roffset = rstrip_offset(str, start, start+olen, enc);
}
if (roffset <= 0) return str_duplicate(rb_cString, str);
return rb_str_subseq(str, 0, olen-roffset);
}
Gibt eine Kopie von self mit entfernten nachgestellten Leerzeichen zurück; siehe Leerzeichen in Zeichenketten
whitespace = "\x00\t\n\v\f\r " s = whitespace + 'abc' + whitespace s # => "\u0000\t\n\v\f\r abc\u0000\t\n\v\f\r " s.rstrip # => "\u0000\t\n\v\f\r abc"
Wenn selectors angegeben sind, werden Zeichen aus selectors vom Ende von self entfernt
s = "---abc+++" s.rstrip("+") # => "---abc"
selectors müssen gültige Zeichenselektoren sein (siehe Character Selectors) und können jede seiner gültigen Formen verwenden, einschließlich Negation, Bereiche und Escapes.
"01234abc56789".rstrip("0-9") # "01234abc" "01234abc56789".rstrip("0-9", "^4-6") # "01234abc56"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_rstrip_bang(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
char *start;
long olen, roffset;
str_modify_keep_cr(str);
enc = STR_ENC_GET(str);
RSTRING_GETMEM(str, start, olen);
if (argc > 0) {
char table[TR_TABLE_SIZE];
VALUE del = 0, nodel = 0;
tr_setup_table_multi(table, &del, &nodel, str, argc, argv);
roffset = rstrip_offset_table(str, start, start+olen, enc, table, del, nodel);
}
else {
roffset = rstrip_offset(str, start, start+olen, enc);
}
if (roffset > 0) {
long len = olen - roffset;
STR_SET_LEN(str, len);
TERM_FILL(start+len, rb_enc_mbminlen(enc));
return str;
}
return Qnil;
}
Ähnlich wie String#rstrip, außer dass
-
das Strippen in
self(nicht in einer Kopie vonself) durchgeführt wird. -
Gibt
selfzurück, wenn Zeichen gestrippt wurden, andernfallsnil.
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_scan(VALUE str, VALUE pat)
{
VALUE result;
long start = 0;
long last = -1, prev = 0;
char *p = RSTRING_PTR(str); long len = RSTRING_LEN(str);
pat = get_pat_quoted(pat, 1);
mustnot_broken(str);
if (!rb_block_given_p()) {
VALUE ary = rb_ary_new();
while (!NIL_P(result = scan_once(str, pat, &start, 0))) {
last = prev;
prev = start;
rb_ary_push(ary, result);
}
if (last >= 0) rb_pat_search(pat, str, last, 1);
else rb_backref_set(Qnil);
return ary;
}
while (!NIL_P(result = scan_once(str, pat, &start, 1))) {
last = prev;
prev = start;
rb_yield(result);
str_mod_check(str, p, len);
}
if (last >= 0) rb_pat_search(pat, str, last, 1);
return str;
}
Passt ein Muster an self an
-
Wenn
patterneinRegexpist, ist das verwendete Musterpatternselbst. -
Wenn
patterneine Zeichenkette ist, ist das verwendete MusterRegexp.quote(pattern).
Generiert eine Sammlung von übereinstimmenden Ergebnissen und aktualisiert Regexp-bezogene globale Variablen
-
Wenn das Muster keine Gruppen enthält, ist jedes Ergebnis eine übereinstimmende Teilzeichenkette.
-
Wenn das Muster Gruppen enthält, ist jedes Ergebnis ein Array, das eine übereinstimmende Teilzeichenkette für jede Gruppe enthält.
Ohne Block wird ein Array der Ergebnisse zurückgegeben
'cruel world'.scan(/\w+/) # => ["cruel", "world"] 'cruel world'.scan(/.../) # => ["cru", "el ", "wor"] 'cruel world'.scan(/(...)/) # => [["cru"], ["el "], ["wor"]] 'cruel world'.scan(/(..)(..)/) # => [["cr", "ue"], ["l ", "wo"]] 'тест'.scan(/../) # => ["те", "ст"] 'こんにちは'.scan(/../) # => ["こん", "にち"] 'abracadabra'.scan('ab') # => ["ab", "ab"] 'abracadabra'.scan('nosuch') # => []
Mit gegebenem Block wird der Block mit jedem Ergebnis aufgerufen; gibt self zurück
'cruel world'.scan(/\w+/) {|w| p w } # => "cruel" # => "world" 'cruel world'.scan(/(.)(.)/) {|x, y| p [x, y] } # => ["c", "r"] # => ["u", "e"] # => ["l", " "] # => ["w", "o"] # => ["r", "l"]
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
str_scrub(int argc, VALUE *argv, VALUE str)
{
VALUE repl = argc ? (rb_check_arity(argc, 0, 1), argv[0]) : Qnil;
VALUE new = rb_str_scrub(str, repl);
return NIL_P(new) ? str_duplicate(rb_cString, str): new;
}
Gibt eine Kopie von self zurück, bei der jede ungültige Byte-Sequenz durch die angegebene replacement_string ersetzt wird.
Ohne Block wird jede ungültige Sequenz durch die angegebene default_replacement_string ersetzt (standardmäßig "�" für eine Unicode-Kodierung, andernfalls '?')
"foo\x81\x81bar"scrub # => "foo��bar"
"foo\x81\x81bar".force_encoding('US-ASCII').scrub # => "foo??bar"
"foo\x81\x81bar".scrub('xyzzy') # => "fooxyzzyxyzzybar"
Mit gegebenem Block wird der Block mit jeder ungültigen Sequenz aufgerufen und diese Sequenz durch den Rückgabewert des Blocks ersetzt
"foo\x81\x81bar".scrub {|sequence| p sequence; 'XYZZY' } # => "fooXYZZYXYZZYbar"
Ausgabe
"\x81" "\x81"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
str_scrub_bang(int argc, VALUE *argv, VALUE str)
{
VALUE repl = argc ? (rb_check_arity(argc, 0, 1), argv[0]) : Qnil;
VALUE new = rb_str_scrub(str, repl);
if (!NIL_P(new)) rb_str_replace(str, new);
return str;
}
Ähnlich wie String#scrub, außer dass
-
Alle Ersetzungen werden in
selfvorgenommen. -
Gibt
selfzurück.
Verwandt: siehe Modifizieren.
Source
VALUE
rb_str_setbyte(VALUE str, VALUE index, VALUE value)
{
long pos = NUM2LONG(index);
long len = RSTRING_LEN(str);
char *ptr, *head, *left = 0;
rb_encoding *enc;
int cr = ENC_CODERANGE_UNKNOWN, width, nlen;
if (pos < -len || len <= pos)
rb_raise(rb_eIndexError, "index %ld out of string", pos);
if (pos < 0)
pos += len;
VALUE v = rb_to_int(value);
VALUE w = rb_int_and(v, INT2FIX(0xff));
char byte = (char)(NUM2INT(w) & 0xFF);
if (!str_independent(str))
str_make_independent(str);
enc = STR_ENC_GET(str);
head = RSTRING_PTR(str);
ptr = &head[pos];
if (!STR_EMBED_P(str)) {
cr = ENC_CODERANGE(str);
switch (cr) {
case ENC_CODERANGE_7BIT:
left = ptr;
*ptr = byte;
if (ISASCII(byte)) goto end;
nlen = rb_enc_precise_mbclen(left, head+len, enc);
if (!MBCLEN_CHARFOUND_P(nlen))
ENC_CODERANGE_SET(str, ENC_CODERANGE_BROKEN);
else
ENC_CODERANGE_SET(str, ENC_CODERANGE_VALID);
goto end;
case ENC_CODERANGE_VALID:
left = rb_enc_left_char_head(head, ptr, head+len, enc);
width = rb_enc_precise_mbclen(left, head+len, enc);
*ptr = byte;
nlen = rb_enc_precise_mbclen(left, head+len, enc);
if (!MBCLEN_CHARFOUND_P(nlen))
ENC_CODERANGE_SET(str, ENC_CODERANGE_BROKEN);
else if (MBCLEN_CHARFOUND_LEN(nlen) != width || ISASCII(byte))
ENC_CODERANGE_CLEAR(str);
goto end;
}
}
ENC_CODERANGE_CLEAR(str);
*ptr = byte;
end:
return value;
}
Setzt das Byte am nullbasierten Offset index auf den Wert des gegebenen integer; gibt integer zurück
s = 'xyzzy' s.setbyte(2, 129) # => 129 s # => "xy\x81zy"
Verwandt: siehe Modifizieren.
Source
# File lib/shellwords.rb, line 238 def shellescape Shellwords.escape(self) end
Escaped str, damit es sicher in einer Bourne-Shell-Befehlszeile verwendet werden kann.
Siehe Shellwords.shellescape für Details.
Source
# File lib/shellwords.rb, line 227 def shellsplit Shellwords.split(self) end
Teilt str in ein Array von Tokens auf, genau wie die UNIX Bourne Shell.
Siehe Shellwords.shellsplit für Details.
Source
static VALUE
rb_str_slice_bang(int argc, VALUE *argv, VALUE str)
{
VALUE result = Qnil;
VALUE indx;
long beg, len = 1;
char *p;
rb_check_arity(argc, 1, 2);
str_modify_keep_cr(str);
indx = argv[0];
if (RB_TYPE_P(indx, T_REGEXP)) {
if (rb_reg_search(indx, str, 0, 0) < 0) return Qnil;
VALUE match = rb_backref_get();
struct re_registers *regs = RMATCH_REGS(match);
int nth = 0;
if (argc > 1 && (nth = rb_reg_backref_number(match, argv[1])) < 0) {
if ((nth += regs->num_regs) <= 0) return Qnil;
}
else if (nth >= regs->num_regs) return Qnil;
beg = BEG(nth);
len = END(nth) - beg;
goto subseq;
}
else if (argc == 2) {
beg = NUM2LONG(indx);
len = NUM2LONG(argv[1]);
goto num_index;
}
else if (FIXNUM_P(indx)) {
beg = FIX2LONG(indx);
if (!(p = rb_str_subpos(str, beg, &len))) return Qnil;
if (!len) return Qnil;
beg = p - RSTRING_PTR(str);
goto subseq;
}
else if (RB_TYPE_P(indx, T_STRING)) {
beg = rb_str_index(str, indx, 0);
if (beg == -1) return Qnil;
len = RSTRING_LEN(indx);
result = str_duplicate(rb_cString, indx);
goto squash;
}
else {
switch (rb_range_beg_len(indx, &beg, &len, str_strlen(str, NULL), 0)) {
case Qnil:
return Qnil;
case Qfalse:
beg = NUM2LONG(indx);
if (!(p = rb_str_subpos(str, beg, &len))) return Qnil;
if (!len) return Qnil;
beg = p - RSTRING_PTR(str);
goto subseq;
default:
goto num_index;
}
}
num_index:
if (!(p = rb_str_subpos(str, beg, &len))) return Qnil;
beg = p - RSTRING_PTR(str);
subseq:
result = rb_str_new(RSTRING_PTR(str)+beg, len);
rb_enc_cr_str_copy_for_substr(result, str);
squash:
if (len > 0) {
if (beg == 0) {
rb_str_drop_bytes(str, len);
}
else {
char *sptr = RSTRING_PTR(str);
long slen = RSTRING_LEN(str);
if (beg + len > slen) /* pathological check */
len = slen - beg;
memmove(sptr + beg,
sptr + beg + len,
slen - (beg + len));
slen -= len;
STR_SET_LEN(str, slen);
TERM_FILL(&sptr[slen], TERM_LEN(str));
}
}
return result;
}
Ähnlich wie String#[] (und dessen Alias String#slice), außer dass
-
Substitutionen in
self(nicht in einer Kopie vonself) durchgeführt werden. -
Gibt die entfernte Teilzeichenkette zurück, wenn Änderungen vorgenommen wurden, andernfalls
nil.
Einige Beispiele
s = 'hello' s.slice!('e') # => "e" s # => "hllo" s.slice!('e') # => nil s # => "hllo"
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_split_m(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
VALUE spat;
VALUE limit;
split_type_t split_type;
long beg, end, i = 0, empty_count = -1;
int lim = 0;
VALUE result, tmp;
result = rb_block_given_p() ? Qfalse : Qnil;
if (rb_scan_args(argc, argv, "02", &spat, &limit) == 2) {
lim = NUM2INT(limit);
if (lim <= 0) limit = Qnil;
else if (lim == 1) {
if (RSTRING_LEN(str) == 0)
return result ? rb_ary_new2(0) : str;
tmp = str_duplicate(rb_cString, str);
if (!result) {
rb_yield(tmp);
return str;
}
return rb_ary_new3(1, tmp);
}
i = 1;
}
if (NIL_P(limit) && !lim) empty_count = 0;
enc = STR_ENC_GET(str);
split_type = SPLIT_TYPE_REGEXP;
if (!NIL_P(spat)) {
spat = get_pat_quoted(spat, 0);
}
else if (NIL_P(spat = rb_fs)) {
split_type = SPLIT_TYPE_AWK;
}
else if (!(spat = rb_fs_check(spat))) {
rb_raise(rb_eTypeError, "value of $; must be String or Regexp");
}
else {
rb_category_warn(RB_WARN_CATEGORY_DEPRECATED, "$; is set to non-nil value");
}
if (split_type != SPLIT_TYPE_AWK) {
switch (BUILTIN_TYPE(spat)) {
case T_REGEXP:
rb_reg_options(spat); /* check if uninitialized */
tmp = RREGEXP_SRC(spat);
split_type = literal_split_pattern(tmp, SPLIT_TYPE_REGEXP);
if (split_type == SPLIT_TYPE_AWK) {
spat = tmp;
split_type = SPLIT_TYPE_STRING;
}
break;
case T_STRING:
mustnot_broken(spat);
split_type = literal_split_pattern(spat, SPLIT_TYPE_STRING);
break;
default:
UNREACHABLE_RETURN(Qnil);
}
}
#define SPLIT_STR(beg, len) ( \
empty_count = split_string(result, str, beg, len, empty_count), \
str_mod_check(str, str_start, str_len))
beg = 0;
char *ptr = RSTRING_PTR(str);
char *const str_start = ptr;
const long str_len = RSTRING_LEN(str);
char *const eptr = str_start + str_len;
if (split_type == SPLIT_TYPE_AWK) {
char *bptr = ptr;
int skip = 1;
unsigned int c;
if (result) result = rb_ary_new();
end = beg;
if (is_ascii_string(str)) {
while (ptr < eptr) {
c = (unsigned char)*ptr++;
if (skip) {
if (ascii_isspace(c)) {
beg = ptr - bptr;
}
else {
end = ptr - bptr;
skip = 0;
if (!NIL_P(limit) && lim <= i) break;
}
}
else if (ascii_isspace(c)) {
SPLIT_STR(beg, end-beg);
skip = 1;
beg = ptr - bptr;
if (!NIL_P(limit)) ++i;
}
else {
end = ptr - bptr;
}
}
}
else {
while (ptr < eptr) {
int n;
c = rb_enc_codepoint_len(ptr, eptr, &n, enc);
ptr += n;
if (skip) {
if (rb_isspace(c)) {
beg = ptr - bptr;
}
else {
end = ptr - bptr;
skip = 0;
if (!NIL_P(limit) && lim <= i) break;
}
}
else if (rb_isspace(c)) {
SPLIT_STR(beg, end-beg);
skip = 1;
beg = ptr - bptr;
if (!NIL_P(limit)) ++i;
}
else {
end = ptr - bptr;
}
}
}
}
else if (split_type == SPLIT_TYPE_STRING) {
char *substr_start = ptr;
char *sptr = RSTRING_PTR(spat);
long slen = RSTRING_LEN(spat);
if (result) result = rb_ary_new();
mustnot_broken(str);
enc = rb_enc_check(str, spat);
while (ptr < eptr &&
(end = rb_memsearch(sptr, slen, ptr, eptr - ptr, enc)) >= 0) {
/* Check we are at the start of a char */
char *t = rb_enc_right_char_head(ptr, ptr + end, eptr, enc);
if (t != ptr + end) {
ptr = t;
continue;
}
SPLIT_STR(substr_start - str_start, (ptr+end) - substr_start);
str_mod_check(spat, sptr, slen);
ptr += end + slen;
substr_start = ptr;
if (!NIL_P(limit) && lim <= ++i) break;
}
beg = ptr - str_start;
}
else if (split_type == SPLIT_TYPE_CHARS) {
int n;
if (result) result = rb_ary_new_capa(RSTRING_LEN(str));
mustnot_broken(str);
enc = rb_enc_get(str);
while (ptr < eptr &&
(n = rb_enc_precise_mbclen(ptr, eptr, enc)) > 0) {
SPLIT_STR(ptr - str_start, n);
ptr += n;
if (!NIL_P(limit) && lim <= ++i) break;
}
beg = ptr - str_start;
}
else {
if (result) result = rb_ary_new();
long len = RSTRING_LEN(str);
long start = beg;
long idx;
int last_null = 0;
struct re_registers *regs;
VALUE match = 0;
for (; rb_reg_search(spat, str, start, 0) >= 0;
(match ? (rb_match_unbusy(match), rb_backref_set(match)) : (void)0)) {
match = rb_backref_get();
if (!result) rb_match_busy(match);
regs = RMATCH_REGS(match);
end = BEG(0);
if (start == end && BEG(0) == END(0)) {
if (!ptr) {
SPLIT_STR(0, 0);
break;
}
else if (last_null == 1) {
SPLIT_STR(beg, rb_enc_fast_mbclen(ptr+beg, eptr, enc));
beg = start;
}
else {
if (start == len)
start++;
else
start += rb_enc_fast_mbclen(ptr+start,eptr,enc);
last_null = 1;
continue;
}
}
else {
SPLIT_STR(beg, end-beg);
beg = start = END(0);
}
last_null = 0;
for (idx=1; idx < regs->num_regs; idx++) {
if (BEG(idx) == -1) continue;
SPLIT_STR(BEG(idx), END(idx)-BEG(idx));
}
if (!NIL_P(limit) && lim <= ++i) break;
}
if (match) rb_match_unbusy(match);
}
if (RSTRING_LEN(str) > 0 && (!NIL_P(limit) || RSTRING_LEN(str) > beg || lim < 0)) {
SPLIT_STR(beg, RSTRING_LEN(str)-beg);
}
return result ? result : str;
}
Erstellt ein Array von Teilzeichenketten, indem self bei jedem Vorkommen des angegebenen Feldtrennzeichens field_sep aufgeteilt wird.
Ohne Argumente wird mit dem Feldtrennzeichen $; aufgeteilt, dessen Standardwert nil ist.
Ohne Block wird das Array von Teilzeichenketten zurückgegeben
'abracadabra'.split('a') # => ["", "br", "c", "d", "br"]
Wenn field_sep nil oder ' ' (ein einzelnes Leerzeichen) ist, wird bei jeder Abfolge von Leerzeichen aufgeteilt
'foo bar baz'.split(nil) # => ["foo", "bar", "baz"] 'foo bar baz'.split(' ') # => ["foo", "bar", "baz"] "foo \n\tbar\t\n baz".split(' ') # => ["foo", "bar", "baz"] 'foo bar baz'.split(' ') # => ["foo", "bar", "baz"] ''.split(' ') # => []
Wenn field_sep eine leere Zeichenkette ist, wird bei jedem Zeichen aufgeteilt
'abracadabra'.split('') # => ["a", "b", "r", "a", "c", "a", "d", "a", "b", "r", "a"] ''.split('') # => [] 'тест'.split('') # => ["т", "е", "с", "т"] 'こんにちは'.split('') # => ["こ", "ん", "に", "ち", "は"]
Wenn field_sep eine nicht leere Zeichenkette ist und sich von ' ' (ein einzelnes Leerzeichen) unterscheidet, wird diese Zeichenkette als Trennzeichen verwendet
'abracadabra'.split('a') # => ["", "br", "c", "d", "br"] 'abracadabra'.split('ab') # => ["", "racad", "ra"] ''.split('a') # => [] 'тест'.split('т') # => ["", "ес"] 'こんにちは'.split('に') # => ["こん", "ちは"]
Wenn field_sep ein Regexp ist, wird bei jedem Vorkommen einer übereinstimmenden Teilzeichenkette aufgeteilt
'abracadabra'.split(/ab/) # => ["", "racad", "ra"] '1 + 1 == 2'.split(/\W+/) # => ["1", "1", "2"] 'abracadabra'.split(//) # => ["a", "b", "r", "a", "c", "a", "d", "a", "b", "r", "a"]
Wenn der Regexp Gruppen enthält, werden deren Treffer in das zurückgegebene Array aufgenommen
'1:2:3'.split(/(:)()()/, 2) # => ["1", ":", "", "", "2:3"]
Das Argument limit setzt eine Grenze für die Größe des zurückgegebenen Arrays; es bestimmt auch, ob nachgestellte leere Zeichenketten in das zurückgegebene Array aufgenommen werden.
Wenn limit null ist, gibt es keine Begrenzung der Array-Größe, aber nachgestellte leere Zeichenketten werden weggelassen
'abracadabra'.split('', 0) # => ["a", "b", "r", "a", "c", "a", "d", "a", "b", "r", "a"] 'abracadabra'.split('a', 0) # => ["", "br", "c", "d", "br"] # Empty string after last 'a' omitted.
Wenn limit eine positive Ganzzahl ist, gibt es eine Begrenzung der Array-Größe (nicht mehr als n - 1 Aufteilungen erfolgen) und nachgestellte leere Zeichenketten werden aufgenommen
'abracadabra'.split('', 3) # => ["a", "b", "racadabra"] 'abracadabra'.split('a', 3) # => ["", "br", "cadabra"] 'abracadabra'.split('', 30) # => ["a", "b", "r", "a", "c", "a", "d", "a", "b", "r", "a", ""] 'abracadabra'.split('a', 30) # => ["", "br", "c", "d", "br", ""] 'abracadabra'.split('', 1) # => ["abracadabra"] 'abracadabra'.split('a', 1) # => ["abracadabra"]
Wenn limit negativ ist, gibt es keine Begrenzung der Array-Größe, und nachgestellte leere Zeichenketten werden weggelassen
'abracadabra'.split('', -1) # => ["a", "b", "r", "a", "c", "a", "d", "a", "b", "r", "a", ""] 'abracadabra'.split('a', -1) # => ["", "br", "c", "d", "br", ""]
Wenn ein Block gegeben ist, wird er mit jeder Teilzeichenkette aufgerufen und gibt self zurück
'foo bar baz'.split(' ') {|substring| p substring }
Ausgabe
"foo" "bar" "baz"
Beachten Sie, dass das obige Beispiel funktional äquivalent ist zu
'foo bar baz'.split(' ').each {|substring| p substring }
Ausgabe
"foo" "bar" "baz"
Aber das Letzte
-
Hat schlechtere Leistung, da es ein Zwischenarray erstellt.
-
Gibt ein Array zurück (anstelle von
self).
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_squeeze(int argc, VALUE *argv, VALUE str)
{
str = str_duplicate(rb_cString, str);
rb_str_squeeze_bang(argc, argv, str);
return str;
}
Gibt eine Kopie von self zurück, bei der jedes Tupel (Verdoppeln, Verdreifachen usw.) von angegebenen Zeichen auf ein einzelnes Zeichen "zusammengestaucht" wird.
Die zu stauchenden Tupel werden durch die Argumente selectors angegeben, von denen jedes eine Zeichenkette ist; siehe Zeichenselektoren.
Ein einzelnes Argument kann ein einzelnes Zeichen sein
'Noooooo!'.squeeze('o') # => "No!" 'foo bar baz'.squeeze(' ') # => "foo bar baz" 'Mississippi'.squeeze('s') # => "Misisippi" 'Mississippi'.squeeze('p') # => "Mississipi" 'Mississippi'.squeeze('x') # => "Mississippi" # Unused selector character is ignored. 'бессонница'.squeeze('с') # => "бесонница" 'бессонница'.squeeze('н') # => "бессоница"
Ein einzelnes Argument kann eine Zeichenkette von Zeichen sein
'Mississippi'.squeeze('sp') # => "Misisipi" 'Mississippi'.squeeze('ps') # => "Misisipi" # Order doesn't matter. 'Mississippi'.squeeze('nonsense') # => "Misisippi" # Unused selector characters are ignored.
Ein einzelnes Argument kann ein Bereich von Zeichen sein
'Mississippi'.squeeze('a-p') # => "Mississipi" 'Mississippi'.squeeze('q-z') # => "Misisippi" 'Mississippi'.squeeze('a-z') # => "Misisipi"
Mehrere Argumente sind zulässig; siehe Mehrere Zeichenselektoren.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_squeeze_bang(int argc, VALUE *argv, VALUE str)
{
char squeez[TR_TABLE_SIZE];
rb_encoding *enc = 0;
VALUE del = 0, nodel = 0;
unsigned char *s, *send, *t;
int i, modify = 0;
int ascompat, singlebyte = single_byte_optimizable(str);
unsigned int save;
if (argc == 0) {
enc = STR_ENC_GET(str);
}
else {
for (i=0; i<argc; i++) {
VALUE s = argv[i];
StringValue(s);
enc = rb_enc_check(str, s);
if (singlebyte && !single_byte_optimizable(s))
singlebyte = 0;
tr_setup_table(s, squeez, i==0, &del, &nodel, enc);
}
}
str_modify_keep_cr(str);
s = t = (unsigned char *)RSTRING_PTR(str);
if (!s || RSTRING_LEN(str) == 0) return Qnil;
send = (unsigned char *)RSTRING_END(str);
save = -1;
ascompat = rb_enc_asciicompat(enc);
if (singlebyte) {
while (s < send) {
unsigned int c = *s++;
if (c != save || (argc > 0 && !squeez[c])) {
*t++ = save = c;
}
}
}
else {
while (s < send) {
unsigned int c;
int clen;
if (ascompat && (c = *s) < 0x80) {
if (c != save || (argc > 0 && !squeez[c])) {
*t++ = save = c;
}
s++;
}
else {
c = rb_enc_codepoint_len((char *)s, (char *)send, &clen, enc);
if (c != save || (argc > 0 && !tr_find(c, squeez, del, nodel))) {
if (t != s) rb_enc_mbcput(c, t, enc);
save = c;
t += clen;
}
s += clen;
}
}
}
TERM_FILL((char *)t, TERM_LEN(str));
if ((char *)t - RSTRING_PTR(str) != RSTRING_LEN(str)) {
STR_SET_LEN(str, (char *)t - RSTRING_PTR(str));
modify = 1;
}
if (modify) return str;
return Qnil;
}
Ähnlich wie String#squeeze, außer dass
-
Zeichen werden in
self(nicht in einer Kopie vonself) gestaucht. -
selfzurückgegeben wird, wenn Änderungen vorgenommen werden, andernfallsnil.
Verwandt: Siehe Ändern.
Source
static VALUE
rb_str_start_with(int argc, VALUE *argv, VALUE str)
{
int i;
for (i=0; i<argc; i++) {
VALUE tmp = argv[i];
if (RB_TYPE_P(tmp, T_REGEXP)) {
if (rb_reg_start_with_p(tmp, str))
return Qtrue;
}
else {
const char *p, *s, *e;
long slen, tlen;
rb_encoding *enc;
StringValue(tmp);
enc = rb_enc_check(str, tmp);
if ((tlen = RSTRING_LEN(tmp)) == 0) return Qtrue;
if ((slen = RSTRING_LEN(str)) < tlen) continue;
p = RSTRING_PTR(str);
e = p + slen;
s = p + tlen;
if (!at_char_right_boundary(p, s, e, enc))
continue;
if (memcmp(p, RSTRING_PTR(tmp), tlen) == 0)
return Qtrue;
}
}
return Qfalse;
}
Gibt zurück, ob self mit einem der gegebenen patterns beginnt.
Für jedes Argument ist das verwendete Muster
-
Das Muster selbst, wenn es ein
Regexpist. -
Regexp.quote(pattern), wenn es eine Zeichenkette ist.
Gibt true zurück, wenn ein Muster am Anfang übereinstimmt, andernfalls false
'hello'.start_with?('hell') # => true 'hello'.start_with?(/H/i) # => true 'hello'.start_with?('heaven', 'hell') # => true 'hello'.start_with?('heaven', 'paradise') # => false 'тест'.start_with?('т') # => true 'こんにちは'.start_with?('こ') # => true
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_strip(int argc, VALUE *argv, VALUE str)
{
char *start;
long olen, loffset, roffset;
rb_encoding *enc = STR_ENC_GET(str);
RSTRING_GETMEM(str, start, olen);
if (argc > 0) {
char table[TR_TABLE_SIZE];
VALUE del = 0, nodel = 0;
tr_setup_table_multi(table, &del, &nodel, str, argc, argv);
loffset = lstrip_offset_table(str, start, start+olen, enc, table, del, nodel);
roffset = rstrip_offset_table(str, start+loffset, start+olen, enc, table, del, nodel);
}
else {
loffset = lstrip_offset(str, start, start+olen, enc);
roffset = rstrip_offset(str, start+loffset, start+olen, enc);
}
if (loffset <= 0 && roffset <= 0) return str_duplicate(rb_cString, str);
return rb_str_subseq(str, loffset, olen-loffset-roffset);
}
Gibt eine Kopie von self mit entfernten führenden und nachgestellten Leerzeichen zurück; siehe Leerzeichen in Zeichenketten
whitespace = "\x00\t\n\v\f\r " s = whitespace + 'abc' + whitespace # => "\u0000\t\n\v\f\r abc\u0000\t\n\v\f\r " s.strip # => "abc"
Wenn selectors angegeben sind, werden Zeichen aus selectors von beiden Enden von self entfernt
s = "---abc+++" s.strip("-+") # => "abc" s.strip("+-") # => "abc"
selectors müssen gültige Zeichenselektoren sein (siehe Character Selectors) und können jede seiner gültigen Formen verwenden, einschließlich Negation, Bereiche und Escapes.
"01234abc56789".strip("0-9") # "abc" "01234abc56789".strip("0-9", "^4-6") # "4abc56"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_strip_bang(int argc, VALUE *argv, VALUE str)
{
char *start;
long olen, loffset, roffset;
rb_encoding *enc;
str_modify_keep_cr(str);
enc = STR_ENC_GET(str);
RSTRING_GETMEM(str, start, olen);
if (argc > 0) {
char table[TR_TABLE_SIZE];
VALUE del = 0, nodel = 0;
tr_setup_table_multi(table, &del, &nodel, str, argc, argv);
loffset = lstrip_offset_table(str, start, start+olen, enc, table, del, nodel);
roffset = rstrip_offset_table(str, start+loffset, start+olen, enc, table, del, nodel);
}
else {
loffset = lstrip_offset(str, start, start+olen, enc);
roffset = rstrip_offset(str, start+loffset, start+olen, enc);
}
if (loffset > 0 || roffset > 0) {
long len = olen-roffset;
if (loffset > 0) {
len -= loffset;
memmove(start, start + loffset, len);
}
STR_SET_LEN(str, len);
TERM_FILL(start+len, rb_enc_mbminlen(enc));
return str;
}
return Qnil;
}
Ähnlich wie String#strip, außer dass
-
Änderungen werden an
selfvorgenommen. -
Gibt
selfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil.
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_sub(int argc, VALUE *argv, VALUE str)
{
str = str_duplicate(rb_cString, str);
rb_str_sub_bang(argc, argv, str);
return str;
}
Gibt eine Kopie von self zurück, möglicherweise mit einer ersetzten Teilzeichenkette.
Das Argument pattern kann eine Zeichenkette oder ein Regexp sein; das Argument replacement kann eine Zeichenkette oder ein Hash sein.
Unterschiedliche Typen für die Argumentwerte machen diese Methode sehr vielseitig.
Unten sind einige einfache Beispiele; für viele weitere Beispiele siehe Substitutionsmethoden.
Mit den Argumenten pattern und der Zeichenkette replacement ersetzt sie die erste übereinstimmende Teilzeichenkette durch die gegebene Ersetzungszeichenkette
s = 'abracadabra' # => "abracadabra" s.sub('bra', 'xyzzy') # => "axyzzycadabra" s.sub(/bra/, 'xyzzy') # => "axyzzycadabra" s.sub('nope', 'xyzzy') # => "abracadabra"
Mit den Argumenten pattern und dem Hash replacement ersetzt sie die erste übereinstimmende Teilzeichenkette durch einen Wert aus dem gegebenen Ersetzungs-Hash oder entfernt sie
h = {'a' => 'A', 'b' => 'B', 'c' => 'C'} s.sub('b', h) # => "aBracadabra" s.sub(/b/, h) # => "aBracadabra" s.sub(/d/, h) # => "abracaabra" # 'd' removed.
Mit dem Argument pattern und einem Block wird der Block mit jedem übereinstimmenden Teilstring aufgerufen; dieser Teilstring wird durch den Rückgabewert des Blocks ersetzt.
s.sub('b') {|match| match.upcase } # => "aBracadabra"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_sub_bang(int argc, VALUE *argv, VALUE str)
{
VALUE pat, repl, hash = Qnil;
int iter = 0;
long plen;
int min_arity = rb_block_given_p() ? 1 : 2;
long beg;
rb_check_arity(argc, min_arity, 2);
if (argc == 1) {
iter = 1;
}
else {
repl = argv[1];
hash = rb_check_hash_type(argv[1]);
if (NIL_P(hash)) {
StringValue(repl);
}
}
pat = get_pat_quoted(argv[0], 1);
str_modifiable(str);
beg = rb_pat_search(pat, str, 0, 1);
if (beg >= 0) {
rb_encoding *enc;
int cr = ENC_CODERANGE(str);
long beg0, end0;
VALUE match, match0 = Qnil;
struct re_registers *regs;
char *p, *rp;
long len, rlen;
match = rb_backref_get();
regs = RMATCH_REGS(match);
if (RB_TYPE_P(pat, T_STRING)) {
beg0 = beg;
end0 = beg0 + RSTRING_LEN(pat);
match0 = pat;
}
else {
beg0 = BEG(0);
end0 = END(0);
if (iter) match0 = rb_reg_nth_match(0, match);
}
if (iter || !NIL_P(hash)) {
p = RSTRING_PTR(str); len = RSTRING_LEN(str);
if (iter) {
repl = rb_obj_as_string(rb_yield(match0));
}
else {
repl = rb_hash_aref(hash, rb_str_subseq(str, beg0, end0 - beg0));
repl = rb_obj_as_string(repl);
}
str_mod_check(str, p, len);
rb_check_frozen(str);
}
else {
repl = rb_reg_regsub(repl, str, regs, RB_TYPE_P(pat, T_STRING) ? Qnil : pat);
}
enc = rb_enc_compatible(str, repl);
if (!enc) {
rb_encoding *str_enc = STR_ENC_GET(str);
p = RSTRING_PTR(str); len = RSTRING_LEN(str);
if (coderange_scan(p, beg0, str_enc) != ENC_CODERANGE_7BIT ||
coderange_scan(p+end0, len-end0, str_enc) != ENC_CODERANGE_7BIT) {
rb_raise(rb_eEncCompatError, "incompatible character encodings: %s and %s",
rb_enc_inspect_name(str_enc),
rb_enc_inspect_name(STR_ENC_GET(repl)));
}
enc = STR_ENC_GET(repl);
}
rb_str_modify(str);
rb_enc_associate(str, enc);
if (ENC_CODERANGE_UNKNOWN < cr && cr < ENC_CODERANGE_BROKEN) {
int cr2 = ENC_CODERANGE(repl);
if (cr2 == ENC_CODERANGE_BROKEN ||
(cr == ENC_CODERANGE_VALID && cr2 == ENC_CODERANGE_7BIT))
cr = ENC_CODERANGE_UNKNOWN;
else
cr = cr2;
}
plen = end0 - beg0;
rlen = RSTRING_LEN(repl);
len = RSTRING_LEN(str);
if (rlen > plen) {
RESIZE_CAPA(str, len + rlen - plen);
}
p = RSTRING_PTR(str);
if (rlen != plen) {
memmove(p + beg0 + rlen, p + beg0 + plen, len - beg0 - plen);
}
rp = RSTRING_PTR(repl);
memmove(p + beg0, rp, rlen);
len += rlen - plen;
STR_SET_LEN(str, len);
TERM_FILL(&RSTRING_PTR(str)[len], TERM_LEN(str));
ENC_CODERANGE_SET(str, cr);
RB_GC_GUARD(match);
return str;
}
return Qnil;
}
Ähnlich wie String#sub, außer dass
-
Änderungen werden an
selfvorgenommen, nicht an einer Kopie vonself. -
selfzurückgegeben wird, wenn Änderungen vorgenommen werden, andernfallsnil.
Verwandt: siehe Modifizieren.
Source
VALUE
rb_str_succ(VALUE orig)
{
VALUE str;
str = rb_str_new(RSTRING_PTR(orig), RSTRING_LEN(orig));
rb_enc_cr_str_copy_for_substr(str, orig);
return str_succ(str);
}
Gibt den Nachfolger von self zurück. Der Nachfolger wird durch Inkrementieren von Zeichen berechnet.
Das erste zu inkrementierende Zeichen ist die rechteste alphanumerische Zeichenkette: oder, wenn keine alphanumerischen Zeichen vorhanden sind, das rechteste Zeichen
'THX1138'.succ # => "THX1139" '<<koala>>'.succ # => "<<koalb>>" '***'.succ # => '**+' 'тест'.succ # => "тесу" 'こんにちは'.succ # => "こんにちば"
Der Nachfolger einer Ziffer ist eine weitere Ziffer, wobei zur nächstlinken Zeichenkette "übertragen" wird für ein "Überlaufen" von 9 zu 0 und eine weitere Ziffer vorangestellt wird, falls erforderlich
'00'.succ # => "01" '09'.succ # => "10" '99'.succ # => "100"
Der Nachfolger eines Buchstabens ist ein weiterer Buchstabe derselben Groß-/Kleinschreibung, wobei zur nächstlinken Zeichenkette für einen Überlauf "übertragen" wird und ein weiterer Buchstabe derselben Groß-/Kleinschreibung vorangestellt wird, falls erforderlich
'aa'.succ # => "ab" 'az'.succ # => "ba" 'zz'.succ # => "aaa" 'AA'.succ # => "AB" 'AZ'.succ # => "BA" 'ZZ'.succ # => "AAA"
Der Nachfolger eines nicht-alphanumerischen Zeichens ist das nächste Zeichen in der Kollationssequenz des zugrunde liegenden Zeichensatzes, wobei für einen Überlauf zur nächstlinken Zeichenkette "übertragen" wird und ein weiteres Zeichen vorangestellt wird, falls erforderlich
s = 0.chr * 3 # => "\x00\x00\x00" s.succ # => "\x00\x00\x01" s = 255.chr * 3 # => "\xFF\xFF\xFF" s.succ # => "\x01\x00\x00\x00"
"Übertragungen" können zwischen und unter Mischungen von alphanumerischen Zeichen auftreten
s = 'zz99zz99' # => "zz99zz99" s.succ # => "aaa00aa00" s = '99zz99zz' # => "99zz99zz" s.succ # => "100aa00aa"
Der Nachfolger einer leeren String ist eine neue leere String
''.succ # => ""
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_succ_bang(VALUE str)
{
rb_str_modify(str);
str_succ(str);
return str;
}
Ähnlich wie String#succ, aber modifiziert self an Ort und Stelle; gibt self zurück.
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_sum(int argc, VALUE *argv, VALUE str)
{
int bits = 16;
char *ptr, *p, *pend;
long len;
VALUE sum = INT2FIX(0);
unsigned long sum0 = 0;
if (rb_check_arity(argc, 0, 1) && (bits = NUM2INT(argv[0])) < 0) {
bits = 0;
}
ptr = p = RSTRING_PTR(str);
len = RSTRING_LEN(str);
pend = p + len;
while (p < pend) {
if (FIXNUM_MAX - UCHAR_MAX < sum0) {
sum = rb_funcall(sum, '+', 1, LONG2FIX(sum0));
str_mod_check(str, ptr, len);
sum0 = 0;
}
sum0 += (unsigned char)*p;
p++;
}
if (bits == 0) {
if (sum0) {
sum = rb_funcall(sum, '+', 1, LONG2FIX(sum0));
}
}
else {
if (sum == INT2FIX(0)) {
if (bits < (int)sizeof(long)*CHAR_BIT) {
sum0 &= (((unsigned long)1)<<bits)-1;
}
sum = LONG2FIX(sum0);
}
else {
VALUE mod;
if (sum0) {
sum = rb_funcall(sum, '+', 1, LONG2FIX(sum0));
}
mod = rb_funcall(INT2FIX(1), idLTLT, 1, INT2FIX(bits));
mod = rb_funcall(mod, '-', 1, INT2FIX(1));
sum = rb_funcall(sum, '&', 1, mod);
}
}
return sum;
}
Gibt eine grundlegende n-Bit Prüfsumme der Zeichen in self zurück; die Prüfsumme ist die Summe des Binärwerts jedes Bytes in self, modulo 2**n - 1
'hello'.sum # => 532 'hello'.sum(4) # => 4 'hello'.sum(64) # => 532 'тест'.sum # => 1405 'こんにちは'.sum # => 2582
Dies ist keine besonders starke Prüfsumme.
Verwandt: siehe Abfragen.
Source
static VALUE
rb_str_swapcase(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
OnigCaseFoldType flags = ONIGENC_CASE_UPCASE | ONIGENC_CASE_DOWNCASE;
VALUE ret;
flags = check_case_options(argc, argv, flags);
enc = str_true_enc(str);
if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return str_duplicate(rb_cString, str);
if (flags&ONIGENC_CASE_ASCII_ONLY) {
ret = rb_str_new(0, RSTRING_LEN(str));
rb_str_ascii_casemap(str, ret, &flags, enc);
}
else {
ret = rb_str_casemap(str, &flags, enc);
}
return ret;
}
Gibt eine Zeichenkette zurück, die die Zeichen von self enthält, mit vertauschten Groß-/Kleinschreibungen
-
Jedes Großbuchstaben wird in Kleinbuchstaben umgewandelt.
-
Jeder Kleinbuchstaben wird in Großbuchstaben umgewandelt.
Beispiele
'Hello'.swapcase # => "hELLO" 'Straße'.swapcase # => "sTRASSE" 'Привет'.swapcase # => "пРИВЕТ" 'RubyGems.org'.swapcase # => "rUBYgEMS.ORG"
Die Größen von self und das großgeschriebene Ergebnis können unterschiedlich sein
s = 'Straße' s.size # => 6 s.swapcase # => "sTRASSE" s.swapcase.size # => 7
Einige Zeichen (und einige Zeichensätze) haben keine Groß-/Kleinschreibungs-Versionen; siehe Case Mapping.
s = '1, 2, 3, ...' s.swapcase == s # => true s = 'こんにちは' s.swapcase == s # => true
Die Groß-/Kleinschreibung wird von der angegebenen mapping beeinflusst, die :ascii, :fold oder :turkic sein kann; siehe Case Mappings.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_swapcase_bang(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
OnigCaseFoldType flags = ONIGENC_CASE_UPCASE | ONIGENC_CASE_DOWNCASE;
flags = check_case_options(argc, argv, flags);
str_modify_keep_cr(str);
enc = str_true_enc(str);
if (flags&ONIGENC_CASE_ASCII_ONLY)
rb_str_ascii_casemap(str, str, &flags, enc);
else
str_shared_replace(str, rb_str_casemap(str, &flags, enc));
if (ONIGENC_CASE_MODIFIED&flags) return str;
return Qnil;
}
Ähnlich wie String#swapcase, außer dass
-
Änderungen werden an
selfvorgenommen, nicht an einer Kopie vonself. -
selfzurückgegeben wird, wenn Änderungen vorgenommen werden, andernfallsnil.
Verwandt: siehe Modifizieren.
Source
static VALUE
string_to_c(VALUE self)
{
VALUE num;
rb_must_asciicompat(self);
(void)parse_comp(rb_str_fill_terminator(self, 1), FALSE, &num);
return num;
}
Gibt ein Complex-Objekt zurück: analysiert die führende Teilzeichenkette von self, um zwei numerische Werte zu extrahieren, die zu den Koordinaten des komplexen Objekts werden.
Die Teilzeichenkette wird entweder als kartesische Koordinaten (reelle und imaginäre Teile) oder als Polarkoordinaten (Betrag und Winkel) interpretiert, abhängig von einem enthaltenen oder implizierten "Trennzeichen"
-
'+','-'oder kein Trennzeichen: kartesische Koordinaten. -
'@': Polarkoordinaten.
Kurz gesagt
In diesen Beispielen verwenden wir die Methode Complex#rect, um kartesische Koordinaten anzuzeigen, und die Methode Complex#polar, um Polarkoordinaten anzuzeigen.
# Rectangular coordinates.
# Real-only: no separator; imaginary part is zero.
'9'.to_c.rect # => [9, 0] # Integer.
'-9'.to_c.rect # => [-9, 0] # Integer (negative).
'2.5'.to_c.rect # => [2.5, 0] # Float.
'1.23e-14'.to_c.rect # => [1.23e-14, 0] # Float with exponent.
'2.5/1'.to_c.rect # => [(5/2), 0] # Rational.
# Some things are ignored.
'foo1'.to_c.rect # => [0, 0] # Unparsed entire substring.
'1foo'.to_c.rect # => [1, 0] # Unparsed trailing substring.
' 1 '.to_c.rect # => [1, 0] # Leading and trailing whitespace.
*
# Imaginary only: trailing 'i' required; real part is zero.
'9i'.to_c.rect # => [0, 9]
'-9i'.to_c.rect # => [0, -9]
'2.5i'.to_c.rect # => [0, 2.5]
'1.23e-14i'.to_c.rect # => [0, 1.23e-14]
'2.5/1i'.to_c.rect # => [0, (5/2)]
# Real and imaginary; '+' or '-' separator; trailing 'i' required.
'2+3i'.to_c.rect # => [2, 3]
'-2-3i'.to_c.rect # => [-2, -3]
'2.5+3i'.to_c.rect # => [2.5, 3]
'2.5+3/2i'.to_c.rect # => [2.5, (3/2)]
# Polar coordinates; '@' separator; magnitude required.
'1.0@0'.to_c.polar # => [1.0, 0.0]
'1.0@'.to_c.polar # => [1.0, 0.0]
"1.0@#{Math::PI}".to_c.polar # => [1.0, 3.141592653589793]
"1.0@#{Math::PI/2}".to_c.polar # => [1.0, 1.5707963267948966]
Geparste Werte
Die Analyse kann als Suche nach numerischen Literalen angesehen werden, die in die Teilzeichenkette eingebettet sind.
Dieser Abschnitt zeigt, wie die Methode numerische Werte aus führenden Teilzeichenketten analysiert. Die Beispiele zeigen nur reelle oder nur imaginäre Analysen; die Analyse ist für jeden Teil gleich.
'1foo'.to_c # => (1+0i) # Ignores trailing unparsed characters. ' 1 '.to_c # => (1+0i) # Ignores leading and trailing whitespace. 'x1'.to_c # => (0+0i) # Finds no leading numeric. # Integer literal embedded in the substring. '1'.to_c # => (1+0i) '-1'.to_c # => (-1+0i) '1i'.to_c # => (0+1i) # Integer literals that don't work. '0b100'.to_c # => (0+0i) # Not parsed as binary. '0o100'.to_c # => (0+0i) # Not parsed as octal. '0d100'.to_c # => (0+0i) # Not parsed as decimal. '0x100'.to_c # => (0+0i) # Not parsed as hexadecimal. '010'.to_c # => (10+0i) # Not parsed as octal. # Float literals: '3.14'.to_c # => (3.14+0i) '3.14i'.to_c # => (0+3.14i) '1.23e4'.to_c # => (12300.0+0i) '1.23e+4'.to_c # => (12300.0+0i) '1.23e-4'.to_c # => (0.000123+0i) # Rational literals: '1/2'.to_c # => ((1/2)+0i) '-1/2'.to_c # => ((-1/2)+0i) '1/2r'.to_c # => ((1/2)+0i) '-1/2r'.to_c # => ((-1/2)+0i)
Kartesische Koordinaten
Mit dem Trennzeichen '+' oder '-' oder ohne Trennzeichen werden die Werte als kartesische Koordinaten interpretiert: reell und imaginär.
Ohne Trennzeichen wird ein einzelner Wert entweder dem reellen oder dem imaginären Teil zugewiesen
''.to_c # => (0+0i) # Defaults to zero. '1'.to_c # => (1+0i) # Real (no trailing 'i'). '1i'.to_c # => (0+1i) # Imaginary (trailing 'i'). 'i'.to_c # => (0+1i) # Special case (imaginary 1).
Mit Trennzeichen '+' sind beide Teile positiv (oder null)
# Without trailing 'i'. '+'.to_c # => (0+0i) # No values: defaults to zero. '+1'.to_c # => (1+0i) # Value after '+': real only. '1+'.to_c # => (1+0i) # Value before '+': real only. '2+1'.to_c # => (2+0i) # Values before and after '+': real and imaginary. # With trailing 'i'. '+1i'.to_c # => (0+1i) # Value after '+': imaginary only. '2+i'.to_c # => (2+1i) # Value before '+': real and imaginary 1. '2+1i'.to_c # => (2+1i) # Values before and after '+': real and imaginary.
Mit Trennzeichen '-' ist der imaginäre Teil negativ
# Without trailing 'i'. '-'.to_c # => (0+0i) # No values: defaults to zero. '-1'.to_c # => (-1+0i) # Value after '-': negative real, zero imaginary. '1-'.to_c # => (1+0i) # Value before '-': positive real, zero imaginary. '2-1'.to_c # => (2+0i) # Values before and after '-': positive real, zero imaginary. # With trailing 'i'. '-1i'.to_c # => (0-1i) # Value after '-': negative real, zero imaginary. '2-i'.to_c # => (2-1i) # Value before '-': positive real, negative imaginary. '2-1i'.to_c # => (2-1i) # Values before and after '-': positive real, negative imaginary.
Beachten Sie, dass das angehängte Zeichen 'i' stattdessen eines von 'I', 'j' oder 'J' sein kann, mit derselben Wirkung.
Polarkoordinaten
Mit Trennzeichen '@') werden die Werte als Polarkoordinaten interpretiert: Betrag und Winkel.
'2@'.to_c.polar # => [2, 0.0] # Value before '@': magnitude only. # Values before and after '@': magnitude and angle. '2@1'.to_c.polar # => [2.0, 1.0] "1.0@#{Math::PI/2}".to_c # => (0.0+1i) "1.0@#{Math::PI}".to_c # => (-1+0.0i) # Magnitude not given: defaults to zero. '@'.to_c.polar # => [0, 0.0] '@1'.to_c.polar # => [0, 0.0] '1.0@0'.to_c # => (1+0.0i)
Beachten Sie, dass in allen Fällen das angehängte Zeichen 'i' stattdessen eines von 'I', 'j', 'J' sein kann, mit derselben Wirkung.
Source
static VALUE
rb_str_to_f(VALUE str)
{
return DBL2NUM(rb_str_to_dbl(str, FALSE));
}
Returns the result of interpreting leading characters in +self+ as a Float: '3.14159'.to_f # => 3.14159 '1.234e-2'.to_f # => 0.01234 Characters past a leading valid number are ignored: '3.14 (pi to two places)'.to_f # => 3.14 Returns zero if there is no leading valid number: 'abcdef'.to_f # => 0.0
Source
static VALUE
rb_str_to_i(int argc, VALUE *argv, VALUE str)
{
int base = 10;
if (rb_check_arity(argc, 0, 1) && (base = NUM2INT(argv[0])) < 0) {
rb_raise(rb_eArgError, "invalid radix %d", base);
}
return rb_str_to_inum(str, base, FALSE);
}
Gibt das Ergebnis der Interpretation führender Zeichen in self als Ganzzahl in der gegebenen base zurück; base muss entweder 0 oder im Bereich (2..36) sein
'123456'.to_i # => 123456 '123def'.to_i(16) # => 1195503
Mit der gegebenen base null kann die Zeichenkette object führende Zeichen enthalten, um die tatsächliche Basis anzugeben
'123def'.to_i(0) # => 123 '0123def'.to_i(0) # => 83 '0b123def'.to_i(0) # => 1 '0o123def'.to_i(0) # => 83 '0d123def'.to_i(0) # => 123 '0x123def'.to_i(0) # => 1195503
Zeichen, die auf eine führende gültige Zahl (in der gegebenen base) folgen, werden ignoriert
'12.345'.to_i # => 12 '12345'.to_i(2) # => 1
Gibt Null zurück, wenn keine führende gültige Zahl vorhanden ist
'abcdef'.to_i # => 0 '2'.to_i(2) # => 0
Verwandt: siehe Konvertierung in Nicht-String.
Source
# File ext/json/lib/json/add/string.rb, line 32 def to_json_raw(...) to_json_raw_object.to_json(...) end
Diese Methode erstellt einen JSON-Text aus dem Ergebnis eines Aufrufs von to_json_raw_object dieser String.
Source
# File ext/json/lib/json/add/string.rb, line 21 def to_json_raw_object { JSON.create_id => self.class.name, "raw" => unpack("C*"), } end
Diese Methode erstellt einen Roh-Objekt-Hash, der in andere Datenstrukturen verschachtelt werden kann und als Rohzeichenkette generiert wird. Diese Methode sollte verwendet werden, wenn Sie Rohzeichenketten anstelle von UTF-8-Zeichenketten in JSON konvertieren möchten, z. B. Binärdaten.
Source
static VALUE
string_to_r(VALUE self)
{
VALUE num;
rb_must_asciicompat(self);
num = parse_rat(RSTRING_PTR(self), RSTRING_END(self), 0, TRUE);
if (RB_FLOAT_TYPE_P(num) && !FLOAT_ZERO_P(num))
rb_raise(rb_eFloatDomainError, "Infinity");
return num;
}
Gibt das Ergebnis der Interpretation führender Zeichen in self als rationalen Wert zurück
'123'.to_r # => (123/1) # Integer literal. '300/2'.to_r # => (150/1) # Rational literal. '-9.2'.to_r # => (-46/5) # Float literal. '-9.2e2'.to_r # => (-920/1) # Float literal.
Ignoriert führende und nachgestellte Leerzeichen sowie nachgestellte nicht-numerische Zeichen
' 2 '.to_r # => (2/1) '21-Jun-09'.to_r # => (21/1)
Gibt Rational null zurück, wenn keine führenden numerischen Zeichen vorhanden sind.
'BWV 1079'.to_r # => (0/1)
HINWEIS: '0.3'.to_r ist äquivalent zu 3/10r, aber anders als 0.3.to_r
'0.3'.to_r # => (3/10) 3/10r # => (3/10) 0.3.to_r # => (5404319552844595/18014398509481984)
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_to_s(VALUE str)
{
if (rb_obj_class(str) != rb_cString) {
return str_duplicate(rb_cString, str);
}
return str;
}
Gibt self zurück, wenn self eine String ist, oder self, konvertiert in eine String, wenn self eine Unterklasse von String ist.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_tr(VALUE str, VALUE src, VALUE repl)
{
str = str_duplicate(rb_cString, str);
tr_trans(str, src, repl, 0);
return str;
}
Gibt eine Kopie von self zurück, bei der jedes Zeichen, das durch die Zeichenkette selector angegeben wird, in das entsprechende Zeichen in der Zeichenkette replacements übersetzt wird. Die Entsprechung ist *positional*
-
Jedes Vorkommen des ersten Zeichens, das von
selectorangegeben wird, wird in das erste Zeichen inreplacementsübersetzt. -
Jedes Vorkommen des zweiten Zeichens, das von
selectorangegeben wird, wird in das zweite Zeichen inreplacementsübersetzt. -
Und so weiter.
Beispiel
'hello'.tr('el', 'ip') #=> "hippo"
Wenn replacements kürzer ist als selector, wird es implizit mit seinem eigenen letzten Zeichen aufgefüllt
'hello'.tr('aeiou', '-') # => "h-ll-" 'hello'.tr('aeiou', 'AA-') # => "hAll-"
Die Argumente selector und replacements müssen gültige Zeichenselektoren sein (siehe Zeichenselektoren) und können jede ihrer gültigen Formen verwenden, einschließlich Negation, Bereiche und Escape-Sequenzen
'hello'.tr('^aeiou', '-') # => "-e--o" # Negation. 'ibm'.tr('b-z', 'a-z') # => "hal" # Range. 'hel^lo'.tr('\^aeiou', '-') # => "h-l-l-" # Escaped leading caret. 'i-b-m'.tr('b\-z', 'a-z') # => "ibabm" # Escaped embedded hyphen. 'foo\\bar'.tr('ab\\', 'XYZ') # => "fooZYXr" # Escaped backslash.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_tr_bang(VALUE str, VALUE src, VALUE repl)
{
return tr_trans(str, src, repl, 0);
}
Source
static VALUE
rb_str_tr_s(VALUE str, VALUE src, VALUE repl)
{
str = str_duplicate(rb_cString, str);
tr_trans(str, src, repl, 1);
return str;
}
Ähnlich wie String#tr, außer
-
Staucht auch die modifizierten Teile der übersetzten Zeichenkette; siehe
String#squeeze. -
Gibt die übersetzte und gestauchte Zeichenkette zurück.
Beispiele
'hello'.tr_s('l', 'r') #=> "hero" 'hello'.tr_s('el', '-') #=> "h-o" 'hello'.tr_s('el', 'hx') #=> "hhxo"
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_tr_s_bang(VALUE str, VALUE src, VALUE repl)
{
return tr_trans(str, src, repl, 1);
}
Ähnlich wie String#tr_s, außer
-
Modifiziert
selfan Ort und Stelle (nicht eine Kopie vonself). -
Gibt
selfzurück, wenn Änderungen vorgenommen wurden, andernfallsnil.
Verwandt: Modifying.
Source
static VALUE
str_undump(VALUE str)
{
const char *s = RSTRING_PTR(str);
const char *s_end = RSTRING_END(str);
rb_encoding *enc = rb_enc_get(str);
VALUE undumped = rb_enc_str_new(s, 0L, enc);
bool utf8 = false;
bool binary = false;
int w;
rb_must_asciicompat(str);
if (rb_str_is_ascii_only_p(str) == Qfalse) {
rb_raise(rb_eRuntimeError, "non-ASCII character detected");
}
if (!str_null_check(str, &w)) {
rb_raise(rb_eRuntimeError, "string contains null byte");
}
if (RSTRING_LEN(str) < 2) goto invalid_format;
if (*s != '"') goto invalid_format;
/* strip '"' at the start */
s++;
for (;;) {
if (s >= s_end) {
rb_raise(rb_eRuntimeError, "unterminated dumped string");
}
if (*s == '"') {
/* epilogue */
s++;
if (s == s_end) {
/* ascii compatible dumped string */
break;
}
else {
static const char force_encoding_suffix[] = ".force_encoding(\""; /* "\")" */
static const char dup_suffix[] = ".dup";
const char *encname;
int encidx;
ptrdiff_t size;
/* check separately for strings dumped by older versions */
size = sizeof(dup_suffix) - 1;
if (s_end - s > size && memcmp(s, dup_suffix, size) == 0) s += size;
size = sizeof(force_encoding_suffix) - 1;
if (s_end - s <= size) goto invalid_format;
if (memcmp(s, force_encoding_suffix, size) != 0) goto invalid_format;
s += size;
if (utf8) {
rb_raise(rb_eRuntimeError, "dumped string contained Unicode escape but used force_encoding");
}
encname = s;
s = memchr(s, '"', s_end-s);
size = s - encname;
if (!s) goto invalid_format;
if (s_end - s != 2) goto invalid_format;
if (s[0] != '"' || s[1] != ')') goto invalid_format;
encidx = rb_enc_find_index2(encname, (long)size);
if (encidx < 0) {
rb_raise(rb_eRuntimeError, "dumped string has unknown encoding name");
}
rb_enc_associate_index(undumped, encidx);
}
break;
}
if (*s == '\\') {
s++;
if (s >= s_end) {
rb_raise(rb_eRuntimeError, "invalid escape");
}
undump_after_backslash(undumped, &s, s_end, &enc, &utf8, &binary);
}
else {
rb_str_cat(undumped, s++, 1);
}
}
RB_GC_GUARD(str);
return undumped;
invalid_format:
rb_raise(rb_eRuntimeError, "invalid dumped string; not wrapped with '\"' nor '\"...\".force_encoding(\"...\")' form");
}
Das Inverse von String#dump; gibt eine Kopie von self zurück, bei der Änderungen der Art, wie sie von String#dump vorgenommen werden, "rückgängig gemacht" wurden.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_unicode_normalize(int argc, VALUE *argv, VALUE str)
{
return unicode_normalize_common(argc, argv, str, id_normalize);
}
Gibt eine Kopie von self zurück, bei der die Unicode-Normalisierung angewendet wurde.
Das Argument form muss eines der folgenden Symbole sein (siehe Unicode-Normalisierungsformen)
-
:nfc: Kanonische Dekomposition, gefolgt von kanonischer Komposition. -
:nfd: Kanonische Dekomposition. -
:nfkc: Kompatibilitätsdekomposition, gefolgt von kanonischer Komposition. -
:nfkd: Kompatibilitätsdekomposition.
Die Kodierung von self muss eine der folgenden sein
-
Encoding::UTF_8. -
Encoding::UTF_16BE. -
Encoding::UTF_16LE. -
Encoding::UTF_32BE. -
Encoding::UTF_32LE. -
Encoding::GB18030. -
Encoding::UCS_2BE. -
Encoding::UCS_4BE.
Beispiele
"a\u0300".unicode_normalize # => "à" # Lowercase 'a' with grave accens. "a\u0300".unicode_normalize(:nfd) # => "à" # Same.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_unicode_normalize_bang(int argc, VALUE *argv, VALUE str)
{
return rb_str_replace(str, unicode_normalize_common(argc, argv, str, id_normalize));
}
Ähnlich wie String#unicode_normalize, außer dass die Normalisierung auf self (nicht auf eine Kopie von self) durchgeführt wird.
Verwandt: siehe Modifizieren.
Source
static VALUE
rb_str_unicode_normalized_p(int argc, VALUE *argv, VALUE str)
{
return unicode_normalize_common(argc, argv, str, id_normalized_p);
}
Gibt zurück, ob self in der angegebenen form der Unicode-Normalisierung vorliegt; siehe String#unicode_normalize.
form muss eines der folgenden sein: :nfc, :nfd, :nfkc oder :nfkd.
Beispiele
"a\u0300".unicode_normalized? # => false "a\u0300".unicode_normalized?(:nfd) # => true "\u00E0".unicode_normalized? # => true "\u00E0".unicode_normalized?(:nfd) # => false
Löst eine Ausnahme aus, wenn self nicht in einer Unicode-Kodierung vorliegt
s = "\xE0".force_encoding(Encoding::ISO_8859_1) s.unicode_normalized? # Raises Encoding::CompatibilityError
Verwandt: siehe Abfragen.
Source
# File pack.rb, line 25 def unpack(fmt, offset: 0) Primitive.attr! :use_block Primitive.pack_unpack(fmt, offset) end
Extrahiert Daten aus self, um neue Objekte zu bilden; siehe Packed Data.
Mit einem gegebenen Block wird der Block mit jedem entpackten Objekt aufgerufen.
Ohne Block wird ein Array mit den entpackten Objekten zurückgegeben.
Verwandt: siehe Konvertierung in Nicht-String.
Source
# File pack.rb, line 37 def unpack1(fmt, offset: 0) Primitive.pack_unpack1(fmt, offset) end
Ähnlich wie String#unpack ohne Block, aber es wird nur das erste extrahierte Objekt entpackt und zurückgegeben. Siehe Packed Data.
Verwandt: siehe Konvertierung in Nicht-String.
Source
static VALUE
rb_str_upcase(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
OnigCaseFoldType flags = ONIGENC_CASE_UPCASE;
VALUE ret;
flags = check_case_options(argc, argv, flags);
enc = str_true_enc(str);
if (case_option_single_p(flags, enc, str)) {
ret = rb_str_new(RSTRING_PTR(str), RSTRING_LEN(str));
str_enc_copy_direct(ret, str);
upcase_single(ret);
}
else if (flags&ONIGENC_CASE_ASCII_ONLY) {
ret = rb_str_new(0, RSTRING_LEN(str));
rb_str_ascii_casemap(str, ret, &flags, enc);
}
else {
ret = rb_str_casemap(str, &flags, enc);
}
return ret;
}
Gibt eine neue Zeichenkette zurück, die die großgeschriebenen Zeichen in self enthält
'hello'.upcase # => "HELLO" 'straße'.upcase # => "STRASSE" 'привет'.upcase # => "ПРИВЕТ" 'RubyGems.org'.upcase # => "RUBYGEMS.ORG"
Die Größen von self und das großgeschriebene Ergebnis können unterschiedlich sein
s = 'Straße' s.size # => 6 s.upcase # => "STRASSE" s.upcase.size # => 7
Einige Zeichen (und einige Zeichensätze) haben keine Groß-/Kleinschreibungs-Versionen; siehe Case Mapping.
s = '1, 2, 3, ...' s.upcase == s # => true s = 'こんにちは' s.upcase == s # => true
Die Groß-/Kleinschreibung wird von der angegebenen mapping beeinflusst, die :ascii, :fold oder :turkic sein kann; siehe Case Mappings.
Verwandt: siehe Konvertierung zu neuem String.
Source
static VALUE
rb_str_upcase_bang(int argc, VALUE *argv, VALUE str)
{
rb_encoding *enc;
OnigCaseFoldType flags = ONIGENC_CASE_UPCASE;
flags = check_case_options(argc, argv, flags);
str_modify_keep_cr(str);
enc = str_true_enc(str);
if (case_option_single_p(flags, enc, str)) {
if (upcase_single(str))
flags |= ONIGENC_CASE_MODIFIED;
}
else if (flags&ONIGENC_CASE_ASCII_ONLY)
rb_str_ascii_casemap(str, str, &flags, enc);
else
str_shared_replace(str, rb_str_casemap(str, &flags, enc));
if (ONIGENC_CASE_MODIFIED&flags) return str;
return Qnil;
}
Ähnlich wie String#upcase, außer dass
-
die Zeichengroß-/Kleinschreibung in
self(nicht in einer Kopie vonself) geändert wird. -
selfzurückgegeben wird, wenn Änderungen vorgenommen werden, andernfallsnil.
Verwandt: Siehe Ändern.
Source
static VALUE
rb_str_upto(int argc, VALUE *argv, VALUE beg)
{
VALUE end, exclusive;
rb_scan_args(argc, argv, "11", &end, &exclusive);
RETURN_ENUMERATOR(beg, argc, argv);
return rb_str_upto_each(beg, end, RTEST(exclusive), str_upto_i, Qnil);
}
Mit einem gegebenen Block wird der Block mit jedem String-Wert aufgerufen, der durch sukzessive Aufrufe von String#succ zurückgegeben wird; der erste Wert ist self, der nächste ist self.succ und so weiter; die Sequenz endet, wenn der Wert other_string erreicht ist; gibt self zurück
a = [] 'a'.upto('f') {|c| a.push(c) } a # => ["a", "b", "c", "d", "e", "f"] a = [] 'Ж'.upto('П') {|c| a.push(c) } a # => ["Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П"] a = [] 'よ'.upto('ろ') {|c| a.push(c) } a # => ["よ", "ら", "り", "る", "れ", "ろ"] a = [] 'a8'.upto('b6') {|c| a.push(c) } a # => ["a8", "a9", "b0", "b1", "b2", "b3", "b4", "b5", "b6"]
Wenn das Argument exclusive als wahrer Wert gegeben ist, wird der letzte Wert weggelassen
a = [] 'a'.upto('f', true) {|c| a.push(c) } a # => ["a", "b", "c", "d", "e"]
Wenn other_string nicht erreicht würde, wird der Block nicht aufgerufen
'25'.upto('5') {|s| fail s } 'aa'.upto('a') {|s| fail s }
Ohne Block wird ein neuer Enumerator zurückgegeben
'a8'.upto('b6') # => #<Enumerator: "a8":upto("b6")>
Verwandt: siehe Iterieren.
Source
static VALUE
rb_str_valid_encoding_p(VALUE str)
{
int cr = rb_enc_str_coderange(str);
return RBOOL(cr != ENC_CODERANGE_BROKEN);
}
Gibt zurück, ob self korrekt kodiert ist
s = 'Straße' s.valid_encoding? # => true s.encoding # => #<Encoding:UTF-8> s.force_encoding(Encoding::ASCII).valid_encoding? # => false
Verwandt: siehe Abfragen.