rbs 3.0.0.dev.2 → 3.0.0.dev.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +2 -1
  3. data/.github/workflows/ruby.yml +4 -0
  4. data/Gemfile.lock +11 -11
  5. data/Rakefile +2 -2
  6. data/Steepfile +1 -1
  7. data/core/array.rbs +573 -423
  8. data/core/basic_object.rbs +11 -39
  9. data/core/binding.rbs +1 -1
  10. data/core/builtin.rbs +8 -0
  11. data/core/class.rbs +37 -0
  12. data/core/comparable.rbs +7 -18
  13. data/core/complex.rbs +2 -2
  14. data/core/data.rbs +419 -0
  15. data/core/dir.rbs +52 -104
  16. data/core/encoding.rbs +22 -181
  17. data/core/enumerable.rbs +212 -175
  18. data/core/enumerator/product.rbs +96 -0
  19. data/core/enumerator.rbs +57 -8
  20. data/core/errors.rbs +8 -2
  21. data/core/exception.rbs +41 -0
  22. data/core/fiber.rbs +95 -12
  23. data/core/file.rbs +840 -275
  24. data/core/file_test.rbs +34 -19
  25. data/core/float.rbs +40 -96
  26. data/core/gc.rbs +15 -3
  27. data/core/hash.rbs +113 -175
  28. data/core/integer.rbs +85 -145
  29. data/core/io/buffer.rbs +187 -60
  30. data/core/io/wait.rbs +28 -16
  31. data/core/io.rbs +1859 -1389
  32. data/core/kernel.rbs +525 -961
  33. data/core/match_data.rbs +306 -142
  34. data/core/math.rbs +506 -234
  35. data/core/method.rbs +0 -24
  36. data/core/module.rbs +110 -17
  37. data/core/nil_class.rbs +2 -0
  38. data/core/numeric.rbs +76 -144
  39. data/core/object.rbs +88 -212
  40. data/core/proc.rbs +17 -5
  41. data/core/process.rbs +22 -5
  42. data/core/ractor.rbs +1 -1
  43. data/core/random.rbs +20 -3
  44. data/core/range.rbs +91 -89
  45. data/core/rational.rbs +2 -3
  46. data/core/rbs/unnamed/argf.rbs +177 -120
  47. data/core/rbs/unnamed/env_class.rbs +89 -163
  48. data/core/rbs/unnamed/random.rbs +36 -12
  49. data/core/refinement.rbs +8 -0
  50. data/core/regexp.rbs +462 -272
  51. data/core/ruby_vm.rbs +210 -0
  52. data/{stdlib/set/0 → core}/set.rbs +43 -47
  53. data/core/string.rbs +1403 -1332
  54. data/core/string_io.rbs +191 -107
  55. data/core/struct.rbs +67 -63
  56. data/core/symbol.rbs +187 -201
  57. data/core/thread.rbs +40 -35
  58. data/core/time.rbs +902 -826
  59. data/core/trace_point.rbs +55 -6
  60. data/core/unbound_method.rbs +48 -24
  61. data/docs/collection.md +4 -0
  62. data/docs/syntax.md +55 -0
  63. data/ext/rbs_extension/parser.c +5 -6
  64. data/lib/rbs/cli.rb +6 -1
  65. data/lib/rbs/collection/cleaner.rb +8 -1
  66. data/lib/rbs/collection/config/lockfile.rb +3 -1
  67. data/lib/rbs/collection/config/lockfile_generator.rb +16 -14
  68. data/lib/rbs/collection/config.rb +1 -1
  69. data/lib/rbs/collection/sources/git.rb +9 -2
  70. data/lib/rbs/collection/sources/local.rb +79 -0
  71. data/lib/rbs/collection/sources.rb +8 -1
  72. data/lib/rbs/environment.rb +6 -5
  73. data/lib/rbs/environment_loader.rb +3 -2
  74. data/lib/rbs/errors.rb +18 -0
  75. data/lib/rbs/locator.rb +26 -7
  76. data/lib/rbs/sorter.rb +2 -2
  77. data/lib/rbs/version.rb +1 -1
  78. data/sig/collection/sources.rbs +32 -3
  79. data/sig/environment.rbs +2 -3
  80. data/sig/locator.rbs +14 -2
  81. data/sig/shims/{abstract_syntax_tree.rbs → _abstract_syntax_tree.rbs} +0 -0
  82. data/stdlib/bigdecimal/0/big_decimal.rbs +16 -13
  83. data/stdlib/cgi/0/core.rbs +16 -0
  84. data/stdlib/coverage/0/coverage.rbs +50 -8
  85. data/stdlib/csv/0/csv.rbs +1 -1
  86. data/stdlib/date/0/date.rbs +856 -726
  87. data/stdlib/date/0/date_time.rbs +83 -210
  88. data/stdlib/erb/0/erb.rbs +13 -36
  89. data/stdlib/etc/0/etc.rbs +127 -20
  90. data/stdlib/fileutils/0/fileutils.rbs +1290 -381
  91. data/stdlib/logger/0/logger.rbs +466 -316
  92. data/stdlib/net-http/0/net-http.rbs +2211 -534
  93. data/stdlib/nkf/0/nkf.rbs +5 -5
  94. data/stdlib/objspace/0/objspace.rbs +31 -14
  95. data/stdlib/openssl/0/openssl.rbs +11 -7
  96. data/stdlib/optparse/0/optparse.rbs +20 -17
  97. data/stdlib/pathname/0/pathname.rbs +21 -4
  98. data/stdlib/pstore/0/pstore.rbs +378 -154
  99. data/stdlib/pty/0/pty.rbs +24 -8
  100. data/stdlib/ripper/0/ripper.rbs +1650 -0
  101. data/stdlib/socket/0/addrinfo.rbs +9 -15
  102. data/stdlib/socket/0/socket.rbs +36 -3
  103. data/stdlib/strscan/0/string_scanner.rbs +7 -5
  104. data/stdlib/tempfile/0/tempfile.rbs +104 -44
  105. data/stdlib/time/0/time.rbs +2 -2
  106. data/stdlib/uri/0/file.rbs +5 -0
  107. data/stdlib/uri/0/generic.rbs +2 -2
  108. data/stdlib/yaml/0/yaml.rbs +2 -2
  109. data/stdlib/zlib/0/zlib.rbs +1 -1
  110. metadata +8 -6
  111. data/core/deprecated.rbs +0 -9
  112. data/sig/shims/ripper.rbs +0 -8
data/core/string.rbs CHANGED
@@ -1,4 +1,4 @@
1
- # <!-- rdoc-file=string.c -->
1
+ # <!-- rdoc-file=string.rb -->
2
2
  # A String object has an arbitrary sequence of bytes, typically representing
3
3
  # text or binary data. A String object may be created using String::new or as
4
4
  # literals.
@@ -8,14 +8,13 @@
8
8
  #
9
9
  # You can create a String object explicitly with:
10
10
  #
11
- # * A [string literal](doc/syntax/literals_rdoc.html#label-String+Literals).
12
- # * A [heredoc
13
- # literal](doc/syntax/literals_rdoc.html#label-Here+Document+Literals).
11
+ # * A [string literal](rdoc-ref:syntax/literals.rdoc@String+Literals).
12
+ # * A [heredoc literal](rdoc-ref:syntax/literals.rdoc@Here+Document+Literals).
14
13
  #
15
14
  #
16
15
  # You can convert certain objects to Strings with:
17
16
  #
18
- # * Method [String](Kernel.html#method-i-String).
17
+ # * Method #String.
19
18
  #
20
19
  #
21
20
  # Some String methods modify `self`. Typically, a method whose name ends with
@@ -57,11 +56,11 @@
57
56
  # Argument `pattern` is commonly a regular expression:
58
57
  #
59
58
  # s = 'hello'
60
- # s.sub(/[aeiou]/, '*') # => "h*llo"
59
+ # s.sub(/[aeiou]/, '*')# => "h*llo"
61
60
  # s.gsub(/[aeiou]/, '*') # => "h*ll*"
62
- # s.gsub(/[aeiou]/, '') # => "hll"
63
- # s.sub(/ell/, 'al') # => "halo"
64
- # s.gsub(/xyzzy/, '*') # => "hello"
61
+ # s.gsub(/[aeiou]/, '')# => "hll"
62
+ # s.sub(/ell/, 'al') # => "halo"
63
+ # s.gsub(/xyzzy/, '*') # => "hello"
65
64
  # 'THX1138'.gsub(/\d+/, '00') # => "THX00"
66
65
  #
67
66
  # When `pattern` is a string, all its characters are treated as ordinary
@@ -101,8 +100,8 @@
101
100
  # Note that `\\\` is interpreted as an escape, i.e., a single backslash.
102
101
  #
103
102
  # Note also that a string literal consumes backslashes. See [String
104
- # Literals](doc/syntax/literals_rdoc.html#label-String+Literals) for details
105
- # about string literals.
103
+ # Literals](rdoc-ref:syntax/literals.rdoc@String+Literals) for details about
104
+ # string literals.
106
105
  #
107
106
  # A back-reference is typically preceded by an additional backslash. For
108
107
  # example, if you want to write a back-reference `\&` in `replacement` with a
@@ -139,281 +138,334 @@
139
138
  # Special match variables such as `$1`, `$2`, `$``, `$&`, and `$'` are set
140
139
  # appropriately.
141
140
  #
142
- # ## What's Here
143
- #
144
- # First, what's elsewhere. Class String:
145
- #
146
- # * Inherits from [class
147
- # Object](Object.html#class-Object-label-What-27s+Here).
148
- # * Includes [module
149
- # Comparable](Comparable.html#module-Comparable-label-What-27s+Here).
150
- #
151
- #
152
- # Here, class String provides methods that are useful for:
141
+ # ## Whitespace in Strings
153
142
  #
154
- # * [Creating a String](#class-String-label-Methods+for+Creating+a+String)
155
- # * [Frozen/Unfrozen
156
- # Strings](#class-String-label-Methods+for+a+Frozen-2FUnfrozen+String)
157
- # * [Querying](#class-String-label-Methods+for+Querying)
158
- # * [Comparing](#class-String-label-Methods+for+Comparing)
159
- # * [Modifying a String](#class-String-label-Methods+for+Modifying+a+String)
160
- # * [Converting to New
161
- # String](#class-String-label-Methods+for+Converting+to+New+String)
162
- # * [Converting to
163
- # Non-String](#class-String-label-Methods+for+Converting+to+Non--5CString)
164
- # * [Iterating](#class-String-label-Methods+for+Iterating)
165
- #
166
- #
167
- # ### Methods for Creating a String
143
+ # In class String, *whitespace* is defined as a contiguous sequence of
144
+ # characters consisting of any mixture of the following:
168
145
  #
169
- # ::new
170
- # : Returns a new string.
146
+ # * NL (null): `"\x00"`, `"\u0000"`.
147
+ # * HT (horizontal tab): `"\x09"`, `"\t"`.
148
+ # * LF (line feed): `"\x0a"`, `"\n"`.
149
+ # * VT (vertical tab): `"\x0b"`, `"\v"`.
150
+ # * FF (form feed): `"\x0c"`, `"\f"`.
151
+ # * CR (carriage return): `"\x0d"`, `"\r"`.
152
+ # * SP (space): `"\x20"`, `" "`.
171
153
  #
172
- # ::try_convert
173
- # : Returns a new string created from a given object.
174
154
  #
155
+ # Whitespace is relevant for these methods:
175
156
  #
157
+ # * #lstrip, #lstrip!: strip leading whitespace.
158
+ # * #rstrip, #rstrip!: strip trailing whitespace.
159
+ # * #strip, #strip!: strip leading and trailing whitespace.
176
160
  #
177
- # ### Methods for a Frozen/Unfrozen String
178
161
  #
179
- # [#+string](#method-i-2B-40)
180
- # : Returns a string that is not frozen: `self`, if not frozen; `self.dup`
181
- # otherwise.
162
+ # ## String Slices
182
163
  #
183
- # [#-string](#method-i-2D-40)
184
- # : Returns a string that is frozen: `self`, if already frozen;
185
- # `self.freeze` otherwise.
164
+ # A *slice* of a string is a substring that is selected by certain criteria.
186
165
  #
187
- # #freeze
188
- # : Freezes `self`, if not already frozen; returns `self`.
166
+ # These instance methods make use of slicing:
189
167
  #
168
+ # * String#[] (also aliased as String#slice) returns a slice copied from
169
+ # `self`.
170
+ # * String#[]= returns a copy of `self` with a slice replaced.
171
+ # * String#slice! returns `self` with a slice removed.
190
172
  #
191
173
  #
192
- # ### Methods for Querying
174
+ # Each of the above methods takes arguments that determine the slice to be
175
+ # copied or replaced.
193
176
  #
194
- # *Counts*
177
+ # The arguments have several forms. For string `string`, the forms are:
195
178
  #
196
- # #length, #size
197
- # : Returns the count of characters (not bytes).
179
+ # * `string[index]`.
180
+ # * `string[start, length]`.
181
+ # * `string[range]`.
182
+ # * `string[regexp, capture = 0]`.
183
+ # * `string[substring]`.
198
184
  #
199
- # #empty?
200
- # : Returns `true` if `self.length` is zero; `false` otherwise.
201
185
  #
202
- # #bytesize
203
- # : Returns the count of bytes.
186
+ # **`string[index]`**
204
187
  #
205
- # #count
206
- # : Returns the count of substrings matching given strings.
188
+ # When non-negative integer argument `index` is given, the slice is the
189
+ # 1-character substring found in `self` at character offset `index`:
207
190
  #
191
+ # 'bar'[0] # => "b"
192
+ # 'bar'[2] # => "r"
193
+ # 'bar'[20] # => nil
194
+ # 'тест'[2] # => "с"
195
+ # 'こんにちは'[4] # => "は"
208
196
  #
197
+ # When negative integer `index` is given, the slice begins at the offset given
198
+ # by counting backward from the end of `self`:
209
199
  #
210
- # *Substrings*
200
+ # 'bar'[-3] # => "b"
201
+ # 'bar'[-1] # => "r"
202
+ # 'bar'[-20] # => nil
211
203
  #
212
- # [#=~](#method-i-3D~)
213
- # : Returns the index of the first substring that matches a given Regexp
214
- # or other object; returns `nil` if no match is found.
204
+ # **`string[start, length]`**
215
205
  #
216
- # #index
217
- # : Returns the index of the *first* occurrence of a given substring;
218
- # returns `nil` if none found.
206
+ # When non-negative integer arguments `start` and `length` are given, the slice
207
+ # begins at character offset `start`, if it exists, and continues for `length`
208
+ # characters, if available:
219
209
  #
220
- # #rindex
221
- # : Returns the index of the *last* occurrence of a given substring;
222
- # returns `nil` if none found.
210
+ # 'foo'[0, 2] # => "fo"
211
+ # 'тест'[1, 2] # => "ес"
212
+ # 'こんにちは'[2, 2] # => "にち"
213
+ # # Zero length.
214
+ # 'foo'[2, 0] # => ""
215
+ # # Length not entirely available.
216
+ # 'foo'[1, 200] # => "oo"
217
+ # # Start out of range.
218
+ # 'foo'[4, 2] # => nil
223
219
  #
224
- # #include?
225
- # : Returns `true` if the string contains a given substring; `false`
226
- # otherwise.
220
+ # Special case: if `start` is equal to the length of `self`, the slice is a new
221
+ # empty string:
227
222
  #
228
- # #match
229
- # : Returns a MatchData object if the string matches a given Regexp; `nil`
230
- # otherwise.
223
+ # 'foo'[3, 2] # => ""
224
+ # 'foo'[3, 200] # => ""
231
225
  #
232
- # #match?
233
- # : Returns `true` if the string matches a given Regexp; `false`
234
- # otherwise.
226
+ # When negative `start` and non-negative `length` are given, the slice beginning
227
+ # is determined by counting backward from the end of `self`, and the slice
228
+ # continues for `length` characters, if available:
235
229
  #
236
- # #start_with?
237
- # : Returns `true` if the string begins with any of the given substrings.
230
+ # 'foo'[-2, 2] # => "oo"
231
+ # 'foo'[-2, 200] # => "oo"
232
+ # # Start out of range.
233
+ # 'foo'[-4, 2] # => nil
238
234
  #
239
- # #end_with?
240
- # : Returns `true` if the string ends with any of the given substrings.
235
+ # When negative `length` is given, there is no slice:
241
236
  #
237
+ # 'foo'[1, -1] # => nil
238
+ # 'foo'[-2, -1] # => nil
242
239
  #
240
+ # **`string[range]`**
243
241
  #
244
- # *Encodings*
242
+ # When Range argument `range` is given, creates a substring of `string` using
243
+ # the indices in `range`. The slice is then determined as above:
245
244
  #
246
- # #encoding
247
- # : Returns the Encoding object that represents the encoding of the
248
- # string.
245
+ # 'foo'[0..1] # => "fo"
246
+ # 'foo'[0, 2] # => "fo"
249
247
  #
250
- # #unicode_normalized?
251
- # : Returns `true` if the string is in Unicode normalized form; `false`
252
- # otherwise.
248
+ # 'foo'[2...2] # => ""
249
+ # 'foo'[2, 0] # => ""
253
250
  #
254
- # #valid_encoding?
255
- # : Returns `true` if the string contains only characters that are valid
256
- # for its encoding.
251
+ # 'foo'[1..200] # => "oo"
252
+ # 'foo'[1, 200] # => "oo"
257
253
  #
258
- # #ascii_only?
259
- # : Returns `true` if the string has only ASCII characters; `false`
260
- # otherwise.
254
+ # 'foo'[4..5] # => nil
255
+ # 'foo'[4, 2] # => nil
261
256
  #
257
+ # 'foo'[-4..-3] # => nil
258
+ # 'foo'[-4, 2] # => nil
262
259
  #
260
+ # 'foo'[3..4] # => ""
261
+ # 'foo'[3, 2] # => ""
263
262
  #
264
- # *Other*
263
+ # 'foo'[-2..-1] # => "oo"
264
+ # 'foo'[-2, 2] # => "oo"
265
265
  #
266
- # #sum
267
- # : Returns a basic checksum for the string: the sum of each byte.
266
+ # 'foo'[-2..197] # => "oo"
267
+ # 'foo'[-2, 200] # => "oo"
268
268
  #
269
- # #hash
270
- # : Returns the integer hash code.
269
+ # **`string[regexp, capture = 0]`**
271
270
  #
271
+ # When the Regexp argument `regexp` is given, and the `capture` argument is `0`,
272
+ # the slice is the first matching substring found in `self`:
272
273
  #
274
+ # 'foo'[/o/] # => "o"
275
+ # 'foo'[/x/] # => nil
276
+ # s = 'hello there'
277
+ # s[/[aeiou](.)\1/] # => "ell"
278
+ # s[/[aeiou](.)\1/, 0] # => "ell"
273
279
  #
274
- # ### Methods for Comparing
280
+ # If argument `capture` is given and not `0`, it should be either an capture
281
+ # group index (integer) or a capture group name (string or symbol); the slice is
282
+ # the specified capture (see Regexp@Capturing):
275
283
  #
276
- # [#==, #===](#method-i-3D-3D)
277
- # : Returns `true` if a given other string has the same content as `self`.
284
+ # s = 'hello there'
285
+ # s[/[aeiou](.)\1/, 1] # => "l"
286
+ # s[/(?<vowel>[aeiou])(?<non_vowel>[^aeiou])/, "non_vowel"] # => "l"
287
+ # s[/(?<vowel>[aeiou])(?<non_vowel>[^aeiou])/, :vowel] # => "e"
278
288
  #
279
- # #eql?
280
- # : Returns `true` if the content is the same as the given other string.
289
+ # If an invalid capture group index is given, there is no slice. If an invalid
290
+ # capture group name is given, `IndexError` is raised.
281
291
  #
282
- # [#<=>](#method-i-3C-3D-3E)
283
- # : Returns -1, 0, or 1 as a given other string is smaller than, equal to,
284
- # or larger than `self`.
292
+ # **`string[substring]`**
285
293
  #
286
- # #casecmp
287
- # : Ignoring case, returns -1, 0, or 1 as a given other string is smaller
288
- # than, equal to, or larger than `self`.
294
+ # When the single String argument `substring` is given, returns the substring
295
+ # from `self` if found, otherwise `nil`:
289
296
  #
290
- # #casecmp?
291
- # : Returns `true` if the string is equal to a given string after Unicode
292
- # case folding; `false` otherwise.
297
+ # 'foo'['oo'] # => "oo"
298
+ # 'foo'['xx'] # => nil
293
299
  #
300
+ # ## What's Here
294
301
  #
302
+ # First, what's elsewhere. Class String:
295
303
  #
296
- # ### Methods for Modifying a String
304
+ # * Inherits from [class Object](rdoc-ref:Object@What-27s+Here).
305
+ # * Includes [module Comparable](rdoc-ref:Comparable@What-27s+Here).
297
306
  #
298
- # Each of these methods modifies `self`.
299
307
  #
300
- # *Insertion*
308
+ # Here, class String provides methods that are useful for:
301
309
  #
302
- # #insert
303
- # : Returns `self` with a given string inserted at a given offset.
310
+ # * [Creating a String](rdoc-ref:String@Methods+for+Creating+a+String)
311
+ # * [Frozen/Unfrozen
312
+ # Strings](rdoc-ref:String@Methods+for+a+Frozen-2FUnfrozen+String)
313
+ # * [Querying](rdoc-ref:String@Methods+for+Querying)
314
+ # * [Comparing](rdoc-ref:String@Methods+for+Comparing)
315
+ # * [Modifying a String](rdoc-ref:String@Methods+for+Modifying+a+String)
316
+ # * [Converting to New
317
+ # String](rdoc-ref:String@Methods+for+Converting+to+New+String)
318
+ # * [Converting to
319
+ # Non-String](rdoc-ref:String@Methods+for+Converting+to+Non--5CString)
320
+ # * [Iterating](rdoc-ref:String@Methods+for+Iterating)
304
321
  #
305
- # #<<
306
- # : Returns `self` concatenated with a given string or integer.
307
322
  #
323
+ # ### Methods for Creating a String
308
324
  #
325
+ # * ::new: Returns a new string.
326
+ # * ::try_convert: Returns a new string created from a given object.
309
327
  #
310
- # *Substitution*
311
328
  #
312
- # #sub!
313
- # : Replaces the first substring that matches a given pattern with a given
314
- # replacement string; returns `self` if any changes, `nil` otherwise.
329
+ # ### Methods for a Frozen/Unfrozen String
315
330
  #
316
- # #gsub!
317
- # : Replaces each substring that matches a given pattern with a given
318
- # replacement string; returns `self` if any changes, `nil` otherwise.
331
+ # * #+@: Returns a string that is not frozen: `self`, if not frozen;
332
+ # `self.dup` otherwise.
333
+ # * #-@: Returns a string that is frozen: `self`, if already frozen;
334
+ # `self.freeze` otherwise.
335
+ # * #freeze: Freezes `self`, if not already frozen; returns `self`.
319
336
  #
320
- # #succ!, #next!
321
- # : Returns `self` modified to become its own successor.
322
337
  #
323
- # #replace
324
- # : Returns `self` with its entire content replaced by a given string.
338
+ # ### Methods for Querying
325
339
  #
326
- # #reverse!
327
- # : Returns `self` with its characters in reverse order.
340
+ # *Counts*
328
341
  #
329
- # #setbyte
330
- # : Sets the byte at a given integer offset to a given value; returns the
331
- # argument.
342
+ # * #length, #size: Returns the count of characters (not bytes).
343
+ # * #empty?: Returns `true` if `self.length` is zero; `false` otherwise.
344
+ # * #bytesize: Returns the count of bytes.
345
+ # * #count: Returns the count of substrings matching given strings.
332
346
  #
333
- # #tr!
334
- # : Replaces specified characters in `self` with specified replacement
335
- # characters; returns `self` if any changes, `nil` otherwise.
336
347
  #
337
- # #tr_s!
338
- # : Replaces specified characters in `self` with specified replacement
339
- # characters, removing duplicates from the substrings that were
340
- # modified; returns `self` if any changes, `nil` otherwise.
348
+ # *Substrings*
341
349
  #
350
+ # * #=~: Returns the index of the first substring that matches a given Regexp
351
+ # or other object; returns `nil` if no match is found.
352
+ # * #index: Returns the index of the *first* occurrence of a given substring;
353
+ # returns `nil` if none found.
354
+ # * #rindex: Returns the index of the *last* occurrence of a given substring;
355
+ # returns `nil` if none found.
356
+ # * #include?: Returns `true` if the string contains a given substring;
357
+ # `false` otherwise.
358
+ # * #match: Returns a MatchData object if the string matches a given Regexp;
359
+ # `nil` otherwise.
360
+ # * #match?: Returns `true` if the string matches a given Regexp; `false`
361
+ # otherwise.
362
+ # * #start_with?: Returns `true` if the string begins with any of the given
363
+ # substrings.
364
+ # * #end_with?: Returns `true` if the string ends with any of the given
365
+ # substrings.
342
366
  #
343
367
  #
344
- # *Casing*
368
+ # *Encodings*
345
369
  #
346
- # #capitalize!
347
- # : Upcases the initial character and downcases all others; returns `self`
348
- # if any changes, `nil` otherwise.
370
+ # * #encoding: Returns the Encoding object that represents the encoding of the
371
+ # string.
372
+ # * #unicode_normalized?: Returns `true` if the string is in Unicode
373
+ # normalized form; `false` otherwise.
374
+ # * #valid_encoding?: Returns `true` if the string contains only characters
375
+ # that are valid for its encoding.
376
+ # * #ascii_only?: Returns `true` if the string has only ASCII characters;
377
+ # `false` otherwise.
349
378
  #
350
- # #downcase!
351
- # : Downcases all characters; returns `self` if any changes, `nil`
352
- # otherwise.
353
379
  #
354
- # #upcase!
355
- # : Upcases all characters; returns `self` if any changes, `nil`
356
- # otherwise.
380
+ # *Other*
357
381
  #
358
- # #swapcase!
359
- # : Upcases each downcase character and downcases each upcase character;
360
- # returns `self` if any changes, `nil` otherwise.
382
+ # * #sum: Returns a basic checksum for the string: the sum of each byte.
383
+ # * #hash: Returns the integer hash code.
361
384
  #
362
385
  #
386
+ # ### Methods for Comparing
363
387
  #
364
- # *Encoding*
388
+ # * #==, #===: Returns `true` if a given other string has the same content as
389
+ # `self`.
390
+ # * #eql?: Returns `true` if the content is the same as the given other
391
+ # string.
392
+ # * #<=>: Returns -1, 0, or 1 as a given other string is smaller than, equal
393
+ # to, or larger than `self`.
394
+ # * #casecmp: Ignoring case, returns -1, 0, or 1 as a given other string is
395
+ # smaller than, equal to, or larger than `self`.
396
+ # * #casecmp?: Returns `true` if the string is equal to a given string after
397
+ # Unicode case folding; `false` otherwise.
365
398
  #
366
- # #encode!
367
- # : Returns `self` with all characters transcoded from one given encoding
368
- # into another.
369
399
  #
370
- # #unicode_normalize!
371
- # : Unicode-normalizes `self`; returns `self`.
400
+ # ### Methods for Modifying a String
372
401
  #
373
- # #scrub!
374
- # : Replaces each invalid byte with a given character; returns `self`.
402
+ # Each of these methods modifies `self`.
375
403
  #
376
- # #force_encoding
377
- # : Changes the encoding to a given encoding; returns `self`.
404
+ # *Insertion*
378
405
  #
406
+ # * #insert: Returns `self` with a given string inserted at a given offset.
407
+ # * #<<: Returns `self` concatenated with a given string or integer.
379
408
  #
380
409
  #
381
- # *Deletion*
410
+ # *Substitution*
382
411
  #
383
- # #clear
384
- # : Removes all content, so that `self` is empty; returns `self`.
412
+ # * #sub!: Replaces the first substring that matches a given pattern with a
413
+ # given replacement string; returns `self` if any changes, `nil` otherwise.
414
+ # * #gsub!: Replaces each substring that matches a given pattern with a given
415
+ # replacement string; returns `self` if any changes, `nil` otherwise.
416
+ # * #succ!, #next!: Returns `self` modified to become its own successor.
417
+ # * #replace: Returns `self` with its entire content replaced by a given
418
+ # string.
419
+ # * #reverse!: Returns `self` with its characters in reverse order.
420
+ # * #setbyte: Sets the byte at a given integer offset to a given value;
421
+ # returns the argument.
422
+ # * #tr!: Replaces specified characters in `self` with specified replacement
423
+ # characters; returns `self` if any changes, `nil` otherwise.
424
+ # * #tr_s!: Replaces specified characters in `self` with specified replacement
425
+ # characters, removing duplicates from the substrings that were modified;
426
+ # returns `self` if any changes, `nil` otherwise.
385
427
  #
386
- # #slice!, #[]=
387
- # : Removes a substring determined by a given index, start/length, range,
388
- # regexp, or substring.
389
428
  #
390
- # #squeeze!
391
- # : Removes contiguous duplicate characters; returns `self`.
429
+ # *Casing*
392
430
  #
393
- # #delete!
394
- # : Removes characters as determined by the intersection of substring
395
- # arguments.
431
+ # * #capitalize!: Upcases the initial character and downcases all others;
432
+ # returns `self` if any changes, `nil` otherwise.
433
+ # * #downcase!: Downcases all characters; returns `self` if any changes, `nil`
434
+ # otherwise.
435
+ # * #upcase!: Upcases all characters; returns `self` if any changes, `nil`
436
+ # otherwise.
437
+ # * #swapcase!: Upcases each downcase character and downcases each upcase
438
+ # character; returns `self` if any changes, `nil` otherwise.
396
439
  #
397
- # #lstrip!
398
- # : Removes leading whitespace; returns `self` if any changes, `nil`
399
- # otherwise.
400
440
  #
401
- # #rstrip!
402
- # : Removes trailing whitespace; returns `self` if any changes, `nil`
403
- # otherwise.
441
+ # *Encoding*
404
442
  #
405
- # #strip!
406
- # : Removes leading and trailing whitespace; returns `self` if any
407
- # changes, `nil` otherwise.
443
+ # * #encode!: Returns `self` with all characters transcoded from one given
444
+ # encoding into another.
445
+ # * #unicode_normalize!: Unicode-normalizes `self`; returns `self`.
446
+ # * #scrub!: Replaces each invalid byte with a given character; returns
447
+ # `self`.
448
+ # * #force_encoding: Changes the encoding to a given encoding; returns `self`.
408
449
  #
409
- # #chomp!
410
- # : Removes trailing record separator, if found; returns `self` if any
411
- # changes, `nil` otherwise.
412
450
  #
413
- # #chop!
414
- # : Removes trailing whitespace if found, otherwise removes the last
415
- # character; returns `self` if any changes, `nil` otherwise.
451
+ # *Deletion*
416
452
  #
453
+ # * #clear: Removes all content, so that `self` is empty; returns `self`.
454
+ # * #slice!, #[]=: Removes a substring determined by a given index,
455
+ # start/length, range, regexp, or substring.
456
+ # * #squeeze!: Removes contiguous duplicate characters; returns `self`.
457
+ # * #delete!: Removes characters as determined by the intersection of
458
+ # substring arguments.
459
+ # * #lstrip!: Removes leading whitespace; returns `self` if any changes, `nil`
460
+ # otherwise.
461
+ # * #rstrip!: Removes trailing whitespace; returns `self` if any changes,
462
+ # `nil` otherwise.
463
+ # * #strip!: Removes leading and trailing whitespace; returns `self` if any
464
+ # changes, `nil` otherwise.
465
+ # * #chomp!: Removes trailing record separator, if found; returns `self` if
466
+ # any changes, `nil` otherwise.
467
+ # * #chop!: Removes trailing newline characters if found; otherwise removes
468
+ # the last character; returns `self` if any changes, `nil` otherwise.
417
469
  #
418
470
  #
419
471
  # ### Methods for Converting to New String
@@ -423,156 +475,85 @@
423
475
  #
424
476
  # *Extension*
425
477
  #
426
- # #*
427
- # : Returns the concatenation of multiple copies of `self`,
428
- #
429
- # #+
430
- # : Returns the concatenation of `self` and a given other string.
431
- #
432
- # #center
433
- # : Returns a copy of `self` centered between pad substring.
434
- #
435
- # #concat
436
- # : Returns the concatenation of `self` with given other strings.
437
- #
438
- # #prepend
439
- # : Returns the concatenation of a given other string with `self`.
440
- #
441
- # #ljust
442
- # : Returns a copy of `self` of a given length, right-padded with a given
443
- # other string.
444
- #
445
- # #rjust
446
- # : Returns a copy of `self` of a given length, left-padded with a given
447
- # other string.
448
- #
478
+ # * #*: Returns the concatenation of multiple copies of `self`,
479
+ # * #+: Returns the concatenation of `self` and a given other string.
480
+ # * #center: Returns a copy of `self` centered between pad substring.
481
+ # * #concat: Returns the concatenation of `self` with given other strings.
482
+ # * #prepend: Returns the concatenation of a given other string with `self`.
483
+ # * #ljust: Returns a copy of `self` of a given length, right-padded with a
484
+ # given other string.
485
+ # * #rjust: Returns a copy of `self` of a given length, left-padded with a
486
+ # given other string.
449
487
  #
450
488
  #
451
489
  # *Encoding*
452
490
  #
453
- # #b
454
- # : Returns a copy of `self` with ASCII-8BIT encoding.
455
- #
456
- # #scrub
457
- # : Returns a copy of `self` with each invalid byte replaced with a given
458
- # character.
459
- #
460
- # #unicode_normalize
461
- # : Returns a copy of `self` with each character Unicode-normalized.
462
- #
463
- # #encode
464
- # : Returns a copy of `self` with all characters transcoded from one given
465
- # encoding into another.
466
- #
491
+ # * #b: Returns a copy of `self` with ASCII-8BIT encoding.
492
+ # * #scrub: Returns a copy of `self` with each invalid byte replaced with a
493
+ # given character.
494
+ # * #unicode_normalize: Returns a copy of `self` with each character
495
+ # Unicode-normalized.
496
+ # * #encode: Returns a copy of `self` with all characters transcoded from one
497
+ # given encoding into another.
467
498
  #
468
499
  #
469
500
  # *Substitution*
470
501
  #
471
- # #dump
472
- # : Returns a copy of +self with all non-printing characters replaced by
473
- # xHH notation and all special characters escaped.
474
- #
475
- # #undump
476
- # : Returns a copy of +self with all `\xNN` notation replace by `\uNNNN`
477
- # notation and all escaped characters unescaped.
478
- #
479
- # #sub
480
- # : Returns a copy of `self` with the first substring matching a given
481
- # pattern replaced with a given replacement string;.
482
- #
483
- # #gsub
484
- # : Returns a copy of `self` with each substring that matches a given
485
- # pattern replaced with a given replacement string.
486
- #
487
- # #succ, #next
488
- # : Returns the string that is the successor to `self`.
489
- #
490
- # #reverse
491
- # : Returns a copy of `self` with its characters in reverse order.
492
- #
493
- # #tr
494
- # : Returns a copy of `self` with specified characters replaced with
495
- # specified replacement characters.
496
- #
497
- # #tr_s
498
- # : Returns a copy of `self` with specified characters replaced with
499
- # specified replacement characters, removing duplicates from the
500
- # substrings that were modified.
501
- #
502
- # #%
503
- # : Returns the string resulting from formatting a given object into
504
- # `self`
505
- #
502
+ # * #dump: Returns a copy of `self` with all non-printing characters replaced
503
+ # by xHH notation and all special characters escaped.
504
+ # * #undump: Returns a copy of `self` with all `\xNN` notation replace by
505
+ # `\uNNNN` notation and all escaped characters unescaped.
506
+ # * #sub: Returns a copy of `self` with the first substring matching a given
507
+ # pattern replaced with a given replacement string;.
508
+ # * #gsub: Returns a copy of `self` with each substring that matches a given
509
+ # pattern replaced with a given replacement string.
510
+ # * #succ, #next: Returns the string that is the successor to `self`.
511
+ # * #reverse: Returns a copy of `self` with its characters in reverse order.
512
+ # * #tr: Returns a copy of `self` with specified characters replaced with
513
+ # specified replacement characters.
514
+ # * #tr_s: Returns a copy of `self` with specified characters replaced with
515
+ # specified replacement characters, removing duplicates from the substrings
516
+ # that were modified.
517
+ # * #%: Returns the string resulting from formatting a given object into
518
+ # `self`
506
519
  #
507
520
  #
508
521
  # *Casing*
509
522
  #
510
- # #capitalize
511
- # : Returns a copy of `self` with the first character upcased and all
512
- # other characters downcased.
513
- #
514
- # #downcase
515
- # : Returns a copy of `self` with all characters downcased.
516
- #
517
- # #upcase
518
- # : Returns a copy of `self` with all characters upcased.
519
- #
520
- # #swapcase
521
- # : Returns a copy of `self` with all upcase characters downcased and all
522
- # downcase characters upcased.
523
- #
523
+ # * #capitalize: Returns a copy of `self` with the first character upcased and
524
+ # all other characters downcased.
525
+ # * #downcase: Returns a copy of `self` with all characters downcased.
526
+ # * #upcase: Returns a copy of `self` with all characters upcased.
527
+ # * #swapcase: Returns a copy of `self` with all upcase characters downcased
528
+ # and all downcase characters upcased.
524
529
  #
525
530
  #
526
531
  # *Deletion*
527
532
  #
528
- # #delete
529
- # : Returns a copy of `self` with characters removed
530
- #
531
- # #delete_prefix
532
- # : Returns a copy of `self` with a given prefix removed.
533
- #
534
- # #delete_suffix
535
- # : Returns a copy of `self` with a given suffix removed.
536
- #
537
- # #lstrip
538
- # : Returns a copy of `self` with leading whitespace removed.
539
- #
540
- # #rstrip
541
- # : Returns a copy of `self` with trailing whitespace removed.
542
- #
543
- # #strip
544
- # : Returns a copy of `self` with leading and trailing whitespace removed.
545
- #
546
- # #chomp
547
- # : Returns a copy of `self` with a trailing record separator removed, if
548
- # found.
549
- #
550
- # #chop
551
- # : Returns a copy of `self` with trailing whitespace or the last
552
- # character removed.
553
- #
554
- # #squeeze
555
- # : Returns a copy of `self` with contiguous duplicate characters removed.
556
- #
557
- # #[], #slice
558
- # : Returns a substring determined by a given index, start/length, or
559
- # range, or string.
560
- #
561
- # #byteslice
562
- # : Returns a substring determined by a given index, start/length, or
563
- # range.
564
- #
565
- # #chr
566
- # : Returns the first character.
567
- #
533
+ # * #delete: Returns a copy of `self` with characters removed
534
+ # * #delete_prefix: Returns a copy of `self` with a given prefix removed.
535
+ # * #delete_suffix: Returns a copy of `self` with a given suffix removed.
536
+ # * #lstrip: Returns a copy of `self` with leading whitespace removed.
537
+ # * #rstrip: Returns a copy of `self` with trailing whitespace removed.
538
+ # * #strip: Returns a copy of `self` with leading and trailing whitespace
539
+ # removed.
540
+ # * #chomp: Returns a copy of `self` with a trailing record separator removed,
541
+ # if found.
542
+ # * #chop: Returns a copy of `self` with trailing newline characters or the
543
+ # last character removed.
544
+ # * #squeeze: Returns a copy of `self` with contiguous duplicate characters
545
+ # removed.
546
+ # * #[], #slice: Returns a substring determined by a given index,
547
+ # start/length, or range, or string.
548
+ # * #byteslice: Returns a substring determined by a given index, start/length,
549
+ # or range.
550
+ # * #chr: Returns the first character.
568
551
  #
569
552
  #
570
553
  # *Duplication*
571
554
  #
572
- # #to_s, $to_str
573
- # : If `self` is a subclass of String, returns `self` copied into a
574
- # String; otherwise, returns `self`.
575
- #
555
+ # * #to_s, $to_str: If `self` is a subclass of String, returns `self` copied
556
+ # into a String; otherwise, returns `self`.
576
557
  #
577
558
  #
578
559
  # ### Methods for Converting to Non-String
@@ -581,116 +562,69 @@
581
562
  #
582
563
  # *Characters, Bytes, and Clusters*
583
564
  #
584
- # #bytes
585
- # : Returns an array of the bytes in `self`.
586
- #
587
- # #chars
588
- # : Returns an array of the characters in `self`.
589
- #
590
- # #codepoints
591
- # : Returns an array of the integer ordinals in `self`.
592
- #
593
- # #getbyte
594
- # : Returns an integer byte as determined by a given index.
595
- #
596
- # #grapheme_clusters
597
- # : Returns an array of the grapheme clusters in `self`.
598
- #
565
+ # * #bytes: Returns an array of the bytes in `self`.
566
+ # * #chars: Returns an array of the characters in `self`.
567
+ # * #codepoints: Returns an array of the integer ordinals in `self`.
568
+ # * #getbyte: Returns an integer byte as determined by a given index.
569
+ # * #grapheme_clusters: Returns an array of the grapheme clusters in `self`.
599
570
  #
600
571
  #
601
572
  # *Splitting*
602
573
  #
603
- # #lines
604
- # : Returns an array of the lines in `self`, as determined by a given
605
- # record separator.
606
- #
607
- # #partition
608
- # : Returns a 3-element array determined by the first substring that
609
- # matches a given substring or regexp,
610
- #
611
- # #rpartition
612
- # : Returns a 3-element array determined by the last substring that
613
- # matches a given substring or regexp,
614
- #
615
- # #split
616
- # : Returns an array of substrings determined by a given delimiter --
617
- # regexp or string -- or, if a block given, passes those substrings to
618
- # the block.
619
- #
574
+ # * #lines: Returns an array of the lines in `self`, as determined by a given
575
+ # record separator.
576
+ # * #partition: Returns a 3-element array determined by the first substring
577
+ # that matches a given substring or regexp,
578
+ # * #rpartition: Returns a 3-element array determined by the last substring
579
+ # that matches a given substring or regexp,
580
+ # * #split: Returns an array of substrings determined by a given delimiter --
581
+ # regexp or string -- or, if a block given, passes those substrings to the
582
+ # block.
620
583
  #
621
584
  #
622
585
  # *Matching*
623
586
  #
624
- # #scan
625
- # : Returns an array of substrings matching a given regexp or string, or,
626
- # if a block given, passes each matching substring to the block.
627
- #
628
- # #unpack
629
- # : Returns an array of substrings extracted from `self` according to a
630
- # given format.
631
- #
632
- # #unpack1
633
- # : Returns the first substring extracted from `self` according to a given
634
- # format.
635
- #
587
+ # * #scan: Returns an array of substrings matching a given regexp or string,
588
+ # or, if a block given, passes each matching substring to the block.
589
+ # * #unpack: Returns an array of substrings extracted from `self` according to
590
+ # a given format.
591
+ # * #unpack1: Returns the first substring extracted from `self` according to a
592
+ # given format.
636
593
  #
637
594
  #
638
595
  # *Numerics*
639
596
  #
640
- # #hex
641
- # : Returns the integer value of the leading characters, interpreted as
642
- # hexadecimal digits.
643
- #
644
- # #oct
645
- # : Returns the integer value of the leading characters, interpreted as
646
- # octal digits.
647
- #
648
- # #ord
649
- # : Returns the integer ordinal of the first character in `self`.
650
- #
651
- # #to_i
652
- # : Returns the integer value of leading characters, interpreted as an
653
- # integer.
654
- #
655
- # #to_f
656
- # : Returns the floating-point value of leading characters, interpreted as
657
- # a floating-point number.
658
- #
597
+ # * #hex: Returns the integer value of the leading characters, interpreted as
598
+ # hexadecimal digits.
599
+ # * #oct: Returns the integer value of the leading characters, interpreted as
600
+ # octal digits.
601
+ # * #ord: Returns the integer ordinal of the first character in `self`.
602
+ # * #to_i: Returns the integer value of leading characters, interpreted as an
603
+ # integer.
604
+ # * #to_f: Returns the floating-point value of leading characters, interpreted
605
+ # as a floating-point number.
659
606
  #
660
607
  #
661
608
  # *Strings and Symbols*
662
609
  #
663
- # #inspect
664
- # : Returns copy of `self`, enclosed in double-quotes, with special
665
- # characters escaped.
666
- #
667
- # #to_sym, #intern
668
- # : Returns the symbol corresponding to `self`.
669
- #
610
+ # * #inspect: Returns copy of `self`, enclosed in double-quotes, with special
611
+ # characters escaped.
612
+ # * #to_sym, #intern: Returns the symbol corresponding to `self`.
670
613
  #
671
614
  #
672
615
  # ### Methods for Iterating
673
616
  #
674
- # #each_byte
675
- # : Calls the given block with each successive byte in `self`.
676
- #
677
- # #each_char
678
- # : Calls the given block with each successive character in `self`.
679
- #
680
- # #each_codepoint
681
- # : Calls the given block with each successive integer codepoint in
682
- # `self`.
683
- #
684
- # #each_grapheme_cluster
685
- # : Calls the given block with each successive grapheme cluster in `self`.
686
- #
687
- # #each_line
688
- # : Calls the given block with each successive line in `self`, as
689
- # determined by a given record separator.
690
- #
691
- # #upto
692
- # : Calls the given block with each string value returned by successive
693
- # calls to #succ.
617
+ # * #each_byte: Calls the given block with each successive byte in `self`.
618
+ # * #each_char: Calls the given block with each successive character in
619
+ # `self`.
620
+ # * #each_codepoint: Calls the given block with each successive integer
621
+ # codepoint in `self`.
622
+ # * #each_grapheme_cluster: Calls the given block with each successive
623
+ # grapheme cluster in `self`.
624
+ # * #each_line: Calls the given block with each successive line in `self`, as
625
+ # determined by a given record separator.
626
+ # * #upto: Calls the given block with each string value returned by successive
627
+ # calls to #succ.
694
628
  #
695
629
  class String
696
630
  include Comparable
@@ -759,7 +693,7 @@ class String
759
693
  # -->
760
694
  # Returns `self` if `self` is not frozen.
761
695
  #
762
- # Otherwise. returns `self.dup`, which is not frozen.
696
+ # Otherwise returns `self.dup`, which is not frozen.
763
697
  #
764
698
  def +@: () -> String
765
699
 
@@ -770,7 +704,9 @@ class String
770
704
  # Returns a frozen, possibly pre-existing copy of the string.
771
705
  #
772
706
  # The returned String will be deduplicated as long as it does not have any
773
- # instance variables set on it.
707
+ # instance variables set on it and is not a String subclass.
708
+ #
709
+ # String#dedup is an alias for String#-@.
774
710
  #
775
711
  def -@: () -> String
776
712
 
@@ -868,14 +804,13 @@ class String
868
804
  # 'foo' =~ /o/ # => 1
869
805
  # 'foo' =~ /x/ # => nil
870
806
  #
871
- # Note: also updates [Regexp-related global
872
- # variables](Regexp.html#class-Regexp-label-Special+global+variables).
807
+ # Note: also updates Regexp@Special+global+variables.
873
808
  #
874
809
  # If the given `object` is not a Regexp, returns the value returned by `object
875
810
  # =~ self`.
876
811
  #
877
812
  # Note that `string =~ regexp` is different from `regexp =~ string` (see
878
- # [Regexp#=~](https://ruby-doc.org/core-2.7.1/Regexp.html#method-i-3D-7E)):
813
+ # Regexp#=~):
879
814
  #
880
815
  # number= nil
881
816
  # "no. 9" =~ /(?<number>\d+)/
@@ -893,152 +828,196 @@ class String
893
828
  # - string[regexp, capture = 0] -> new_string or nil
894
829
  # - string[substring] -> new_string or nil
895
830
  # -->
896
- # Returns the substring of `self` specified by the arguments.
831
+ # Returns the substring of `self` specified by the arguments. See examples at
832
+ # [String Slices](rdoc-ref:String@String+Slices).
897
833
  #
898
- # When the single Integer argument `index` is given, returns the 1-character
899
- # substring found in `self` at offset `index`:
834
+ def []: (int index) -> String?
835
+ | (int start, int length) -> String?
836
+ | (Range[Integer] | Range[Integer?] range) -> String?
837
+ | (Regexp regexp) -> String?
838
+ | (Regexp regexp, int | String capture) -> String?
839
+ | (String match_str) -> String?
840
+
841
+ # <!--
842
+ # rdoc-file=string.c
843
+ # - string[index] = new_string
844
+ # - string[start, length] = new_string
845
+ # - string[range] = new_string
846
+ # - string[regexp, capture = 0] = new_string
847
+ # - string[substring] = new_string
848
+ # -->
849
+ # Replaces all, some, or none of the contents of `self`; returns `new_string`.
850
+ # See [String Slices](rdoc-ref:String@String+Slices).
900
851
  #
901
- # 'bar'[2] # => "r"
852
+ # A few examples:
902
853
  #
903
- # Counts backward from the end of `self` if `index` is negative:
854
+ # s = 'foo'
855
+ # s[2] = 'rtune' # => "rtune"
856
+ # s # => "fortune"
857
+ # s[1, 5] = 'init' # => "init"
858
+ # s # => "finite"
859
+ # s[3..4] = 'al' # => "al"
860
+ # s # => "finale"
861
+ # s[/e$/] = 'ly' # => "ly"
862
+ # s # => "finally"
863
+ # s['lly'] = 'ncial' # => "ncial"
864
+ # s # => "financial"
904
865
  #
905
- # 'foo'[-3] # => "f"
866
+ # String#slice is an alias for String#[].
906
867
  #
907
- # Returns `nil` if `index` is out of range:
868
+ def []=: (int pos, String new_str) -> String
869
+ | (int begin_pos, int end_pos, String new_str) -> String
870
+ | (Range[Integer] | Range[Integer?] range, String new_str) -> String
871
+ | (Regexp regexp, String new_str) -> String
872
+ | (Regexp regexp, int capture, String new_str) -> String
873
+ | (Regexp regexp, String name, String new_str) -> String
874
+ | (String other_str, String new_str) -> String
875
+
876
+ # <!--
877
+ # rdoc-file=string.c
878
+ # - ascii_only? -> true or false
879
+ # -->
880
+ # Returns `true` if `self` contains only ASCII characters, `false` otherwise:
908
881
  #
909
- # 'foo'[3] # => nil
910
- # 'foo'[-4] # => nil
882
+ # 'abc'.ascii_only? # => true
883
+ # "abc\u{6666}".ascii_only? # => false
911
884
  #
912
- # When the two Integer arguments `start` and `length` are given, returns the
913
- # substring of the given `length` found in `self` at offset `start`:
885
+ def ascii_only?: () -> bool
886
+
887
+ # <!--
888
+ # rdoc-file=string.c
889
+ # - b -> string
890
+ # -->
891
+ # Returns a copy of `self` that has ASCII-8BIT encoding; the underlying bytes
892
+ # are not modified:
914
893
  #
915
- # 'foo'[0, 2] # => "fo"
916
- # 'foo'[0, 0] # => ""
894
+ # s = "\x99"
895
+ # s.encoding # => #<Encoding:UTF-8>
896
+ # t = s.b # => "\x99"
897
+ # t.encoding # => #<Encoding:ASCII-8BIT>
917
898
  #
918
- # Counts backward from the end of `self` if `start` is negative:
899
+ # s = "\u4095" # => "䂕"
900
+ # s.encoding # => #<Encoding:UTF-8>
901
+ # s.bytes # => [228, 130, 149]
902
+ # t = s.b # => "\xE4\x82\x95"
903
+ # t.encoding # => #<Encoding:ASCII-8BIT>
904
+ # t.bytes # => [228, 130, 149]
919
905
  #
920
- # 'foo'[-2, 2] # => "oo"
906
+ def b: () -> String
907
+
908
+ # <!--
909
+ # rdoc-file=string.c
910
+ # - byteindex(substring, offset = 0) -> integer or nil
911
+ # - byteindex(regexp, offset = 0) -> integer or nil
912
+ # -->
913
+ # Returns the Integer byte-based index of the first occurrence of the given
914
+ # `substring`, or `nil` if none found:
921
915
  #
922
- # Special case: returns a new empty String if `start` is equal to the length of
923
- # `self`:
916
+ # 'foo'.byteindex('f') # => 0
917
+ # 'foo'.byteindex('o') # => 1
918
+ # 'foo'.byteindex('oo') # => 1
919
+ # 'foo'.byteindex('ooo') # => nil
924
920
  #
925
- # 'foo'[3, 2] # => ""
921
+ # Returns the Integer byte-based index of the first match for the given Regexp
922
+ # `regexp`, or `nil` if none found:
926
923
  #
927
- # Returns `nil` if `start` is out of range:
924
+ # 'foo'.byteindex(/f/) # => 0
925
+ # 'foo'.byteindex(/o/) # => 1
926
+ # 'foo'.byteindex(/oo/) # => 1
927
+ # 'foo'.byteindex(/ooo/) # => nil
928
928
  #
929
- # 'foo'[4, 2] # => nil
930
- # 'foo'[-4, 2] # => nil
929
+ # Integer argument `offset`, if given, specifies the byte-based position in the
930
+ # string to begin the search:
931
931
  #
932
- # Returns the trailing substring of `self` if `length` is large:
932
+ # 'foo'.byteindex('o', 1) # => 1
933
+ # 'foo'.byteindex('o', 2) # => 2
934
+ # 'foo'.byteindex('o', 3) # => nil
933
935
  #
934
- # 'foo'[1, 50] # => "oo"
936
+ # If `offset` is negative, counts backward from the end of `self`:
935
937
  #
936
- # Returns `nil` if `length` is negative:
938
+ # 'foo'.byteindex('o', -1) # => 2
939
+ # 'foo'.byteindex('o', -2) # => 1
940
+ # 'foo'.byteindex('o', -3) # => 1
941
+ # 'foo'.byteindex('o', -4) # => nil
937
942
  #
938
- # 'foo'[0, -1] # => nil
943
+ # If `offset` does not land on character (codepoint) boundary, `IndexError` is
944
+ # raised.
939
945
  #
940
- # When the single Range argument `range` is given, derives `start` and `length`
941
- # values from the given `range`, and returns values as above:
946
+ # Related: String#index, String#byterindex.
942
947
  #
943
- # * `'foo'[0..1]` is equivalent to `'foo'[0, 2]`.
944
- # * `'foo'[0...1]` is equivalent to `'foo'[0, 1]`.
948
+ def byteindex: (Regexp | string substr_or_regexp, ?int offset) -> Integer?
949
+
950
+ # <!--
951
+ # rdoc-file=string.c
952
+ # - byterindex(substring, offset = self.bytesize) -> integer or nil
953
+ # - byterindex(regexp, offset = self.bytesize) -> integer or nil
954
+ # -->
955
+ # Returns the Integer byte-based index of the *last* occurrence of the given
956
+ # `substring`, or `nil` if none found:
945
957
  #
958
+ # 'foo'.byterindex('f') # => 0
959
+ # 'foo'.byterindex('o') # => 2
960
+ # 'foo'.byterindex('oo') # => 1
961
+ # 'foo'.byterindex('ooo') # => nil
946
962
  #
947
- # When the Regexp argument `regexp` is given, and the `capture` argument is `0`,
948
- # returns the first matching substring found in `self`, or `nil` if none found:
963
+ # Returns the Integer byte-based index of the *last* match for the given Regexp
964
+ # `regexp`, or `nil` if none found:
949
965
  #
950
- # 'foo'[/o/] # => "o"
951
- # 'foo'[/x/] # => nil
952
- # s = 'hello there'
953
- # s[/[aeiou](.)\1/] # => "ell"
954
- # s[/[aeiou](.)\1/, 0] # => "ell"
966
+ # 'foo'.byterindex(/f/) # => 0
967
+ # 'foo'.byterindex(/o/) # => 2
968
+ # 'foo'.byterindex(/oo/) # => 1
969
+ # 'foo'.byterindex(/ooo/) # => nil
955
970
  #
956
- # If argument `capture` is given and not `0`, it should be either an Integer
957
- # capture group index or a String or Symbol capture group name; the method call
958
- # returns only the specified capture (see [Regexp
959
- # Capturing](Regexp.html#class-Regexp-label-Capturing)):
971
+ # The *last* match means starting at the possible last position, not the last of
972
+ # longest matches.
960
973
  #
961
- # s = 'hello there'
962
- # s[/[aeiou](.)\1/, 1] # => "l"
963
- # s[/(?<vowel>[aeiou])(?<non_vowel>[^aeiou])/, "non_vowel"] # => "l"
964
- # s[/(?<vowel>[aeiou])(?<non_vowel>[^aeiou])/, :vowel] # => "e"
974
+ # 'foo'.byterindex(/o+/) # => 2
975
+ # $~ #=> #<MatchData "o">
965
976
  #
966
- # If an invalid capture group index is given, `nil` is returned. If an invalid
967
- # capture group name is given, `IndexError` is raised.
977
+ # To get the last longest match, needs to combine with negative lookbehind.
968
978
  #
969
- # When the single String argument `substring` is given, returns the substring
970
- # from `self` if found, otherwise `nil`:
979
+ # 'foo'.byterindex(/(?<!o)o+/) # => 1
980
+ # $~ #=> #<MatchData "oo">
971
981
  #
972
- # 'foo'['oo'] # => "oo"
973
- # 'foo'['xx'] # => nil
982
+ # Or String#byteindex with negative lookforward.
974
983
  #
975
- # String#slice is an alias for String#[].
984
+ # 'foo'.byteindex(/o+(?!.*o)/) # => 1
985
+ # $~ #=> #<MatchData "oo">
976
986
  #
977
- def []: (int index) -> String?
978
- | (int start, int length) -> String?
979
- | (Range[Integer] | Range[Integer?] range) -> String?
980
- | (Regexp regexp) -> String?
981
- | (Regexp regexp, int | String capture) -> String?
982
- | (String match_str) -> String?
983
-
984
- # <!--
985
- # rdoc-file=string.c
986
- # - str[integer] = new_str
987
- # - str[integer, integer] = new_str
988
- # - str[range] = aString
989
- # - str[regexp] = new_str
990
- # - str[regexp, integer] = new_str
991
- # - str[regexp, name] = new_str
992
- # - str[other_str] = new_str
993
- # -->
994
- # Element Assignment---Replaces some or all of the content of *str*. The portion
995
- # of the string affected is determined using the same criteria as String#[]. If
996
- # the replacement string is not the same length as the text it is replacing, the
997
- # string will be adjusted accordingly. If the regular expression or string is
998
- # used as the index doesn't match a position in the string, IndexError is
999
- # raised. If the regular expression form is used, the optional second Integer
1000
- # allows you to specify which portion of the match to replace (effectively using
1001
- # the MatchData indexing rules. The forms that take an Integer will raise an
1002
- # IndexError if the value is out of range; the Range form will raise a
1003
- # RangeError, and the Regexp and String will raise an IndexError on negative
1004
- # match.
987
+ # Integer argument `offset`, if given and non-negative, specifies the maximum
988
+ # starting byte-based position in the
989
+ # string to _end_ the search:
1005
990
  #
1006
- def []=: (int pos, String new_str) -> String
1007
- | (int begin_pos, int end_pos, String new_str) -> String
1008
- | (Range[Integer] | Range[Integer?] range, String new_str) -> String
1009
- | (Regexp regexp, String new_str) -> String
1010
- | (Regexp regexp, int capture, String new_str) -> String
1011
- | (Regexp regexp, String name, String new_str) -> String
1012
- | (String other_str, String new_str) -> String
1013
-
1014
- # <!--
1015
- # rdoc-file=string.c
1016
- # - str.ascii_only? -> true or false
1017
- # -->
1018
- # Returns true for a string which has only ASCII characters.
991
+ # 'foo'.byterindex('o', 0) # => nil
992
+ # 'foo'.byterindex('o', 1) # => 1
993
+ # 'foo'.byterindex('o', 2) # => 2
994
+ # 'foo'.byterindex('o', 3) # => 2
995
+ #
996
+ # If `offset` is a negative Integer, the maximum starting position in the string
997
+ # to *end* the search is the sum of the string's length and `offset`:
1019
998
  #
1020
- # "abc".force_encoding("UTF-8").ascii_only? #=> true
1021
- # "abc\u{6666}".force_encoding("UTF-8").ascii_only? #=> false
999
+ # 'foo'.byterindex('o', -1) # => 2
1000
+ # 'foo'.byterindex('o', -2) # => 1
1001
+ # 'foo'.byterindex('o', -3) # => nil
1002
+ # 'foo'.byterindex('o', -4) # => nil
1022
1003
  #
1023
- def ascii_only?: () -> bool
1024
-
1025
- # <!--
1026
- # rdoc-file=string.c
1027
- # - str.b -> str
1028
- # -->
1029
- # Returns a copied string whose encoding is ASCII-8BIT.
1004
+ # If `offset` does not land on character (codepoint) boundary, `IndexError` is
1005
+ # raised.
1030
1006
  #
1031
- def b: () -> String
1007
+ # Related: String#byteindex.
1008
+ #
1009
+ def byterindex: (Regexp | string substr_or_regexp, ?int offset) -> Integer?
1032
1010
 
1033
1011
  # <!--
1034
1012
  # rdoc-file=string.c
1035
- # - str.bytes -> an_array
1013
+ # - bytes -> array_of_bytes
1036
1014
  # -->
1037
- # Returns an array of bytes in *str*. This is a shorthand for
1038
- # `str.each_byte.to_a`.
1015
+ # Returns an array of the bytes in `self`:
1039
1016
  #
1040
- # If a block is given, which is a deprecated form, works the same as
1041
- # `each_byte`.
1017
+ # 'hello'.bytes # => [104, 101, 108, 108, 111]
1018
+ # 'тест'.bytes # => [209, 130, 208, 181, 209, 129, 209, 130]
1019
+ # 'こんにちは'.bytes
1020
+ # # => [227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175]
1042
1021
  #
1043
1022
  def bytes: () -> Array[Integer]
1044
1023
  | () { (Integer byte) -> void } -> String
@@ -1047,12 +1026,17 @@ class String
1047
1026
  # rdoc-file=string.c
1048
1027
  # - bytesize -> integer
1049
1028
  # -->
1050
- # Returns the count of bytes in `self`:
1029
+ # Returns the count of bytes (not characters) in `self`:
1030
+ #
1031
+ # 'foo'.bytesize # => 3
1032
+ # 'тест'.bytesize # => 8
1033
+ # 'こんにちは'.bytesize # => 15
1051
1034
  #
1052
- # "\x80\u3042".bytesize # => 4
1053
- # "hello".bytesize # => 5
1035
+ # Contrast with String#length:
1054
1036
  #
1055
- # Related: String#length.
1037
+ # 'foo'.length # => 3
1038
+ # 'тест'.length # => 4
1039
+ # 'こんにちは'.length # => 5
1056
1040
  #
1057
1041
  def bytesize: () -> Integer
1058
1042
 
@@ -1100,6 +1084,23 @@ class String
1100
1084
  def byteslice: (int start, ?int length) -> String?
1101
1085
  | (Range[Integer] | Range[Integer?] range) -> String?
1102
1086
 
1087
+ # <!--
1088
+ # rdoc-file=string.c
1089
+ # - bytesplice(index, length, str) -> string
1090
+ # - bytesplice(range, str) -> string
1091
+ # -->
1092
+ # Replaces some or all of the content of `self` with `str`, and returns `self`.
1093
+ # The portion of the string affected is determined using the same criteria as
1094
+ # String#byteslice, except that `length` cannot be omitted. If the replacement
1095
+ # string is not the same length as the text it is replacing, the string will be
1096
+ # adjusted accordingly. The form that take an Integer will raise an IndexError
1097
+ # if the value is out of range; the Range form will raise a RangeError. If the
1098
+ # beginning or ending offset does not land on character (codepoint) boundary, an
1099
+ # IndexError will be raised.
1100
+ #
1101
+ def bytesplice: (int index, int length, string str) -> String
1102
+ | (Range[int?], string str) -> String
1103
+
1103
1104
  # <!--
1104
1105
  # rdoc-file=string.c
1105
1106
  # - capitalize(*options) -> string
@@ -1111,7 +1112,7 @@ class String
1111
1112
  # s.capitalize # => "Hello world!"
1112
1113
  #
1113
1114
  # The casing may be affected by the given `options`; see [Case
1114
- # Mapping](doc/case_mapping_rdoc.html).
1115
+ # Mapping](rdoc-ref:case_mapping.rdoc).
1115
1116
  #
1116
1117
  # Related: String#capitalize!.
1117
1118
  #
@@ -1133,7 +1134,7 @@ class String
1133
1134
  # s.capitalize! # => nil
1134
1135
  #
1135
1136
  # The casing may be affected by the given `options`; see [Case
1136
- # Mapping](doc/case_mapping_rdoc.html).
1137
+ # Mapping](rdoc-ref:case_mapping.rdoc).
1137
1138
  #
1138
1139
  # Related: String#capitalize.
1139
1140
  #
@@ -1163,7 +1164,7 @@ class String
1163
1164
  # 'foo'.casecmp('FOO') # => 0
1164
1165
  # 'foo'.casecmp(1) # => nil
1165
1166
  #
1166
- # See [Case Mapping](doc/case_mapping_rdoc.html).
1167
+ # See [Case Mapping](rdoc-ref:case_mapping.rdoc).
1167
1168
  #
1168
1169
  # Related: String#casecmp?.
1169
1170
  #
@@ -1186,7 +1187,7 @@ class String
1186
1187
  #
1187
1188
  # 'foo'.casecmp?(1) # => nil
1188
1189
  #
1189
- # See [Case Mapping](doc/case_mapping_rdoc.html).
1190
+ # See [Case Mapping](rdoc-ref:case_mapping.rdoc).
1190
1191
  #
1191
1192
  # Related: String#casecmp.
1192
1193
  #
@@ -1194,85 +1195,119 @@ class String
1194
1195
 
1195
1196
  # <!--
1196
1197
  # rdoc-file=string.c
1197
- # - str.center(width, padstr=' ') -> new_str
1198
+ # - center(size, pad_string = ' ') -> new_string
1198
1199
  # -->
1199
- # Centers `str` in `width`. If `width` is greater than the length of `str`,
1200
- # returns a new String of length `width` with `str` centered and padded with
1201
- # `padstr`; otherwise, returns `str`.
1200
+ # Returns a centered copy of `self`.
1201
+ #
1202
+ # If integer argument `size` is greater than the size (in characters) of `self`,
1203
+ # returns a new string of length `size` that is a copy of `self`, centered and
1204
+ # padded on both ends with `pad_string`:
1205
+ #
1206
+ # 'hello'.center(10) # => " hello "
1207
+ # ' hello'.center(10) # => " hello "
1208
+ # 'hello'.center(10, 'ab') # => "abhelloaba"
1209
+ # 'тест'.center(10) # => " тест "
1210
+ # 'こんにちは'.center(10) # => " こんにちは "
1211
+ #
1212
+ # If `size` is not greater than the size of `self`, returns a copy of `self`:
1202
1213
  #
1203
- # "hello".center(4) #=> "hello"
1204
- # "hello".center(20) #=> " hello "
1205
- # "hello".center(20, '123') #=> "1231231hello12312312"
1214
+ # 'hello'.center(5) # => "hello"
1215
+ # 'hello'.center(1) # => "hello"
1216
+ #
1217
+ # Related: String#ljust, String#rjust.
1206
1218
  #
1207
1219
  def center: (int width, ?string padstr) -> String
1208
1220
 
1209
1221
  # <!--
1210
1222
  # rdoc-file=string.c
1211
- # - str.chars -> an_array
1223
+ # - chars -> array_of_characters
1212
1224
  # -->
1213
- # Returns an array of characters in *str*. This is a shorthand for
1214
- # `str.each_char.to_a`.
1225
+ # Returns an array of the characters in `self`:
1215
1226
  #
1216
- # If a block is given, which is a deprecated form, works the same as
1217
- # `each_char`.
1227
+ # 'hello'.chars # => ["h", "e", "l", "l", "o"]
1228
+ # 'тест'.chars # => ["т", "е", "с", "т"]
1229
+ # 'こんにちは'.chars # => ["こ", "ん", "に", "ち", "は"]
1218
1230
  #
1219
1231
  def chars: () -> Array[String]
1220
1232
  | () { (String char) -> void } -> String
1221
1233
 
1222
1234
  # <!--
1223
1235
  # rdoc-file=string.c
1224
- # - str.chomp(separator=$/) -> new_str
1236
+ # - chomp(line_sep = $/) -> new_string
1225
1237
  # -->
1226
- # Returns a new String with the given record separator removed from the end of
1227
- # *str* (if present). If `$/` has not been changed from the default Ruby record
1228
- # separator, then `chomp` also removes carriage return characters (that is, it
1229
- # will remove `\n`, `\r`, and `\r\n`). If `$/` is an empty string, it will
1230
- # remove all trailing newlines from the string.
1238
+ # Returns a new string copied from `self`, with trailing characters possibly
1239
+ # removed:
1240
+ #
1241
+ # When `line_sep` is `"\n"`, removes the last one or two characters if they are
1242
+ # `"\r"`, `"\n"`, or `"\r\n"` (but not `"\n\r"`):
1243
+ #
1244
+ # $/ # => "\n"
1245
+ # "abc\r".chomp # => "abc"
1246
+ # "abc\n".chomp # => "abc"
1247
+ # "abc\r\n".chomp # => "abc"
1248
+ # "abc\n\r".chomp # => "abc\n"
1249
+ # "тест\r\n".chomp # => "тест"
1250
+ # "こんにちは\r\n".chomp # => "こんにちは"
1231
1251
  #
1232
- # "hello".chomp #=> "hello"
1233
- # "hello\n".chomp #=> "hello"
1234
- # "hello\r\n".chomp #=> "hello"
1235
- # "hello\n\r".chomp #=> "hello\n"
1236
- # "hello\r".chomp #=> "hello"
1237
- # "hello \n there".chomp #=> "hello \n there"
1238
- # "hello".chomp("llo") #=> "he"
1239
- # "hello\r\n\r\n".chomp('') #=> "hello"
1240
- # "hello\r\n\r\r\n".chomp('') #=> "hello\r\n\r"
1252
+ # When `line_sep` is `''` (an empty string), removes multiple trailing
1253
+ # occurrences of `"\n"` or `"\r\n"` (but not `"\r"` or `"\n\r"`):
1254
+ #
1255
+ # "abc\n\n\n".chomp('') # => "abc"
1256
+ # "abc\r\n\r\n\r\n".chomp('') # => "abc"
1257
+ # "abc\n\n\r\n\r\n\n\n".chomp('') # => "abc"
1258
+ # "abc\n\r\n\r\n\r".chomp('') # => "abc\n\r\n\r\n\r"
1259
+ # "abc\r\r\r".chomp('') # => "abc\r\r\r"
1260
+ #
1261
+ # When `line_sep` is neither `"\n"` nor `''`, removes a single trailing line
1262
+ # separator if there is one:
1263
+ #
1264
+ # 'abcd'.chomp('d') # => "abc"
1265
+ # 'abcdd'.chomp('d') # => "abcd"
1241
1266
  #
1242
1267
  def chomp: (?string separator) -> String
1243
1268
 
1244
1269
  # <!--
1245
1270
  # rdoc-file=string.c
1246
- # - str.chomp!(separator=$/) -> str or nil
1271
+ # - chomp!(line_sep = $/) -> self or nil
1247
1272
  # -->
1248
- # Modifies *str* in place as described for String#chomp, returning *str*, or
1249
- # `nil` if no modifications were made.
1273
+ # Like String#chomp, but modifies `self` in place; returns `nil` if no
1274
+ # modification made, `self` otherwise.
1250
1275
  #
1251
1276
  def chomp!: (?string separator) -> String?
1252
1277
 
1253
1278
  # <!--
1254
1279
  # rdoc-file=string.c
1255
- # - str.chop -> new_str
1280
+ # - chop -> new_string
1256
1281
  # -->
1257
- # Returns a new String with the last character removed. If the string ends with
1258
- # `\r\n`, both characters are removed. Applying `chop` to an empty string
1259
- # returns an empty string. String#chomp is often a safer alternative, as it
1260
- # leaves the string unchanged if it doesn't end in a record separator.
1282
+ # Returns a new string copied from `self`, with trailing characters possibly
1283
+ # removed.
1284
+ #
1285
+ # Removes `"\r\n"` if those are the last two characters.
1286
+ #
1287
+ # "abc\r\n".chop # => "abc"
1288
+ # "тест\r\n".chop # => "тест"
1289
+ # "こんにちは\r\n".chop # => "こんにちは"
1290
+ #
1291
+ # Otherwise removes the last character if it exists.
1261
1292
  #
1262
- # "string\r\n".chop #=> "string"
1263
- # "string\n\r".chop #=> "string\n"
1264
- # "string\n".chop #=> "string"
1265
- # "string".chop #=> "strin"
1266
- # "x".chop.chop #=> ""
1293
+ # 'abcd'.chop # => "abc"
1294
+ # 'тест'.chop # => "тес"
1295
+ # 'こんにちは'.chop # => "こんにち"
1296
+ # ''.chop # => ""
1297
+ #
1298
+ # If you only need to remove the newline separator at the end of the string,
1299
+ # String#chomp is a better alternative.
1267
1300
  #
1268
1301
  def chop: () -> String
1269
1302
 
1270
1303
  # <!--
1271
1304
  # rdoc-file=string.c
1272
- # - str.chop! -> str or nil
1305
+ # - chop! -> self or nil
1273
1306
  # -->
1274
- # Processes *str* as for String#chop, returning *str*, or `nil` if *str* is the
1275
- # empty string. See also String#chomp!.
1307
+ # Like String#chop, but modifies `self` in place; returns `nil` if `self` is
1308
+ # empty, `self` otherwise.
1309
+ #
1310
+ # Related: String#chomp!.
1276
1311
  #
1277
1312
  def chop!: () -> String?
1278
1313
 
@@ -1300,13 +1335,14 @@ class String
1300
1335
 
1301
1336
  # <!--
1302
1337
  # rdoc-file=string.c
1303
- # - str.codepoints -> an_array
1338
+ # - codepoints -> array_of_integers
1304
1339
  # -->
1305
- # Returns an array of the Integer ordinals of the characters in *str*. This is
1306
- # a shorthand for `str.each_codepoint.to_a`.
1340
+ # Returns an array of the codepoints in `self`; each codepoint is the integer
1341
+ # value for a character:
1307
1342
  #
1308
- # If a block is given, which is a deprecated form, works the same as
1309
- # `each_codepoint`.
1343
+ # 'hello'.codepoints # => [104, 101, 108, 108, 111]
1344
+ # 'тест'.codepoints # => [1090, 1077, 1089, 1090]
1345
+ # 'こんにちは'.codepoints # => [12371, 12435, 12395, 12385, 12399]
1310
1346
  #
1311
1347
  def codepoints: () -> ::Array[Integer]
1312
1348
  | () { (Integer codepoint) -> void } -> String
@@ -1333,14 +1369,11 @@ class String
1333
1369
 
1334
1370
  # <!--
1335
1371
  # rdoc-file=string.c
1336
- # - str.count([other_str]+) -> integer
1372
+ # - count(*selectors) -> integer
1337
1373
  # -->
1338
- # Each `other_str` parameter defines a set of characters to count. The
1339
- # intersection of these sets defines the characters to count in `str`. Any
1340
- # `other_str` that starts with a caret `^` is negated. The sequence `c1-c2`
1341
- # means all characters between c1 and c2. The backslash character `\` can be
1342
- # used to escape `^` or `-` and is otherwise ignored unless it appears at the
1343
- # end of a sequence or the end of a `other_str`.
1374
+ # Returns the total number of characters in `self` that are specified by the
1375
+ # given `selectors` (see [Multiple Character
1376
+ # Selectors](rdoc-ref:character_selectors.rdoc@Multiple+Character+Selectors)):
1344
1377
  #
1345
1378
  # a = "hello world"
1346
1379
  # a.count "lo" #=> 5
@@ -1360,7 +1393,7 @@ class String
1360
1393
 
1361
1394
  # <!--
1362
1395
  # rdoc-file=string.c
1363
- # - str.crypt(salt_str) -> new_str
1396
+ # - crypt(salt_str) -> new_string
1364
1397
  # -->
1365
1398
  # Returns the string generated by calling `crypt(3)` standard library function
1366
1399
  # with `str` and `salt_str`, in this order, as its arguments. Please do not use
@@ -1414,13 +1447,23 @@ class String
1414
1447
  #
1415
1448
  def crypt: (string salt_str) -> String
1416
1449
 
1450
+ # <!-- rdoc-file=string.c -->
1451
+ # Returns a frozen, possibly pre-existing copy of the string.
1452
+ #
1453
+ # The returned String will be deduplicated as long as it does not have any
1454
+ # instance variables set on it and is not a String subclass.
1455
+ #
1456
+ # String#dedup is an alias for String#-@.
1457
+ #
1458
+ alias dedup -@
1459
+
1417
1460
  # <!--
1418
1461
  # rdoc-file=string.c
1419
- # - str.delete([other_str]+) -> new_str
1462
+ # - delete(*selectors) -> new_string
1420
1463
  # -->
1421
- # Returns a copy of *str* with all characters in the intersection of its
1422
- # arguments deleted. Uses the same rules for building the set of characters as
1423
- # String#count.
1464
+ # Returns a copy of `self` with characters specified by `selectors` removed (see
1465
+ # [Multiple Character
1466
+ # Selectors](rdoc-ref:character_selectors.rdoc@Multiple+Character+Selectors)):
1424
1467
  #
1425
1468
  # "hello".delete "l","lo" #=> "heo"
1426
1469
  # "hello".delete "lo" #=> "he"
@@ -1431,54 +1474,58 @@ class String
1431
1474
 
1432
1475
  # <!--
1433
1476
  # rdoc-file=string.c
1434
- # - str.delete!([other_str]+) -> str or nil
1477
+ # - delete!(*selectors) -> self or nil
1435
1478
  # -->
1436
- # Performs a `delete` operation in place, returning *str*, or `nil` if *str* was
1437
- # not modified.
1479
+ # Like String#delete, but modifies `self` in place. Returns `self` if any
1480
+ # changes were made, `nil` otherwise.
1438
1481
  #
1439
1482
  def delete!: (string other_str, *string other_strs) -> String?
1440
1483
 
1441
1484
  # <!--
1442
1485
  # rdoc-file=string.c
1443
- # - str.delete_prefix(prefix) -> new_str
1486
+ # - delete_prefix(prefix) -> new_string
1444
1487
  # -->
1445
- # Returns a copy of *str* with leading `prefix` deleted.
1488
+ # Returns a copy of `self` with leading substring `prefix` removed:
1489
+ #
1490
+ # 'hello'.delete_prefix('hel') # => "lo"
1491
+ # 'hello'.delete_prefix('llo') # => "hello"
1492
+ # 'тест'.delete_prefix('те') # => "ст"
1493
+ # 'こんにちは'.delete_prefix('こん') # => "にちは"
1446
1494
  #
1447
- # "hello".delete_prefix("hel") #=> "lo"
1448
- # "hello".delete_prefix("llo") #=> "hello"
1495
+ # Related: String#delete_prefix!, String#delete_suffix.
1449
1496
  #
1450
1497
  def delete_prefix: (string prefix) -> String
1451
1498
 
1452
1499
  # <!--
1453
1500
  # rdoc-file=string.c
1454
- # - str.delete_prefix!(prefix) -> self or nil
1501
+ # - delete_prefix!(prefix) -> self or nil
1455
1502
  # -->
1456
- # Deletes leading `prefix` from *str*, returning `nil` if no change was made.
1457
- #
1458
- # "hello".delete_prefix!("hel") #=> "lo"
1459
- # "hello".delete_prefix!("llo") #=> nil
1503
+ # Like String#delete_prefix, except that `self` is modified in place. Returns
1504
+ # `self` if the prefix is removed, `nil` otherwise.
1460
1505
  #
1461
1506
  def delete_prefix!: (string prefix) -> String?
1462
1507
 
1463
1508
  # <!--
1464
1509
  # rdoc-file=string.c
1465
- # - str.delete_suffix(suffix) -> new_str
1510
+ # - delete_suffix(suffix) -> new_string
1466
1511
  # -->
1467
- # Returns a copy of *str* with trailing `suffix` deleted.
1512
+ # Returns a copy of `self` with trailing substring `suffix` removed:
1513
+ #
1514
+ # 'hello'.delete_suffix('llo') # => "he"
1515
+ # 'hello'.delete_suffix('hel') # => "hello"
1516
+ # 'тест'.delete_suffix('ст') # => "те"
1517
+ # 'こんにちは'.delete_suffix('ちは') # => "こんに"
1468
1518
  #
1469
- # "hello".delete_suffix("llo") #=> "he"
1470
- # "hello".delete_suffix("hel") #=> "hello"
1519
+ # Related: String#delete_suffix!, String#delete_prefix.
1471
1520
  #
1472
1521
  def delete_suffix: (string suffix) -> String
1473
1522
 
1474
1523
  # <!--
1475
1524
  # rdoc-file=string.c
1476
- # - str.delete_suffix!(suffix) -> self or nil
1525
+ # - delete_suffix!(suffix) -> self or nil
1477
1526
  # -->
1478
- # Deletes trailing `suffix` from *str*, returning `nil` if no change was made.
1479
- #
1480
- # "hello".delete_suffix!("llo") #=> "he"
1481
- # "hello".delete_suffix!("hel") #=> nil
1527
+ # Like String#delete_suffix, except that `self` is modified in place. Returns
1528
+ # `self` if the suffix is removed, `nil` otherwise.
1482
1529
  #
1483
1530
  def delete_suffix!: (string suffix) -> String?
1484
1531
 
@@ -1492,7 +1539,7 @@ class String
1492
1539
  # s.downcase # => "hello world!"
1493
1540
  #
1494
1541
  # The casing may be affected by the given `options`; see [Case
1495
- # Mapping](doc/case_mapping_rdoc.html).
1542
+ # Mapping](rdoc-ref:case_mapping.rdoc).
1496
1543
  #
1497
1544
  # Related: String#downcase!, String#upcase, String#upcase!.
1498
1545
  #
@@ -1514,7 +1561,7 @@ class String
1514
1561
  # s.downcase! # => nil
1515
1562
  #
1516
1563
  # The casing may be affected by the given `options`; see [Case
1517
- # Mapping](doc/case_mapping_rdoc.html).
1564
+ # Mapping](rdoc-ref:case_mapping.rdoc).
1518
1565
  #
1519
1566
  # Related: String#downcase, String#upcase, String#upcase!.
1520
1567
  #
@@ -1540,117 +1587,165 @@ class String
1540
1587
 
1541
1588
  # <!--
1542
1589
  # rdoc-file=string.c
1543
- # - str.each_byte {|integer| block } -> str
1544
- # - str.each_byte -> an_enumerator
1590
+ # - each_byte {|byte| ... } -> self
1591
+ # - each_byte -> enumerator
1545
1592
  # -->
1546
- # Passes each byte in *str* to the given block, or returns an enumerator if no
1547
- # block is given.
1593
+ # Calls the given block with each successive byte from `self`; returns `self`:
1548
1594
  #
1549
- # "hello".each_byte {|c| print c, ' ' }
1595
+ # 'hello'.each_byte {|byte| print byte, ' ' }
1596
+ # print "\n"
1597
+ # 'тест'.each_byte {|byte| print byte, ' ' }
1598
+ # print "\n"
1599
+ # 'こんにちは'.each_byte {|byte| print byte, ' ' }
1600
+ # print "\n"
1550
1601
  #
1551
- # *produces:*
1602
+ # Output:
1552
1603
  #
1553
1604
  # 104 101 108 108 111
1605
+ # 209 130 208 181 209 129 209 130
1606
+ # 227 129 147 227 130 147 227 129 171 227 129 161 227 129 175
1607
+ #
1608
+ # Returns an enumerator if no block is given.
1554
1609
  #
1555
1610
  def each_byte: () { (Integer byte) -> void } -> self
1556
1611
  | () -> ::Enumerator[Integer, self]
1557
1612
 
1558
1613
  # <!--
1559
1614
  # rdoc-file=string.c
1560
- # - str.each_char {|cstr| block } -> str
1561
- # - str.each_char -> an_enumerator
1615
+ # - each_char {|c| ... } -> self
1616
+ # - each_char -> enumerator
1562
1617
  # -->
1563
- # Passes each character in *str* to the given block, or returns an enumerator if
1564
- # no block is given.
1618
+ # Calls the given block with each successive character from `self`; returns
1619
+ # `self`:
1565
1620
  #
1566
- # "hello".each_char {|c| print c, ' ' }
1621
+ # 'hello'.each_char {|char| print char, ' ' }
1622
+ # print "\n"
1623
+ # 'тест'.each_char {|char| print char, ' ' }
1624
+ # print "\n"
1625
+ # 'こんにちは'.each_char {|char| print char, ' ' }
1626
+ # print "\n"
1567
1627
  #
1568
- # *produces:*
1628
+ # Output:
1569
1629
  #
1570
1630
  # h e l l o
1631
+ # т е с т
1632
+ # こ ん に ち は
1633
+ #
1634
+ # Returns an enumerator if no block is given.
1571
1635
  #
1572
1636
  def each_char: () { (String char) -> void } -> self
1573
1637
  | () -> ::Enumerator[String, self]
1574
1638
 
1575
1639
  # <!--
1576
1640
  # rdoc-file=string.c
1577
- # - str.each_codepoint {|integer| block } -> str
1578
- # - str.each_codepoint -> an_enumerator
1641
+ # - each_codepoint {|integer| ... } -> self
1642
+ # - each_codepoint -> enumerator
1579
1643
  # -->
1580
- # Passes the Integer ordinal of each character in *str*, also known as a
1581
- # *codepoint* when applied to Unicode strings to the given block. For encodings
1582
- # other than UTF-8/UTF-16(BE|LE)/UTF-32(BE|LE), values are directly derived from
1583
- # the binary representation of each character.
1644
+ # Calls the given block with each successive codepoint from `self`; each
1645
+ # codepoint is the integer value for a character; returns `self`:
1584
1646
  #
1585
- # If no block is given, an enumerator is returned instead.
1647
+ # 'hello'.each_codepoint {|codepoint| print codepoint, ' ' }
1648
+ # print "\n"
1649
+ # 'тест'.each_codepoint {|codepoint| print codepoint, ' ' }
1650
+ # print "\n"
1651
+ # 'こんにちは'.each_codepoint {|codepoint| print codepoint, ' ' }
1652
+ # print "\n"
1586
1653
  #
1587
- # "hello\u0639".each_codepoint {|c| print c, ' ' }
1654
+ # Output:
1588
1655
  #
1589
- # *produces:*
1656
+ # 104 101 108 108 111
1657
+ # 1090 1077 1089 1090
1658
+ # 12371 12435 12395 12385 12399
1590
1659
  #
1591
- # 104 101 108 108 111 1593
1660
+ # Returns an enumerator if no block is given.
1592
1661
  #
1593
1662
  def each_codepoint: () { (Integer codepoint) -> void } -> self
1594
1663
  | () -> ::Enumerator[Integer, self]
1595
1664
 
1596
1665
  # <!--
1597
1666
  # rdoc-file=string.c
1598
- # - str.each_grapheme_cluster {|cstr| block } -> str
1599
- # - str.each_grapheme_cluster -> an_enumerator
1667
+ # - each_grapheme_cluster {|gc| ... } -> self
1668
+ # - each_grapheme_cluster -> enumerator
1600
1669
  # -->
1601
- # Passes each grapheme cluster in *str* to the given block, or returns an
1602
- # enumerator if no block is given. Unlike String#each_char, this enumerates by
1603
- # grapheme clusters defined by Unicode Standard Annex #29
1604
- # http://unicode.org/reports/tr29/
1670
+ # Calls the given block with each successive grapheme cluster from `self` (see
1671
+ # [Unicode Grapheme Cluster
1672
+ # Boundaries](https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries)
1673
+ # ); returns `self`:
1674
+ #
1675
+ # s = "\u0061\u0308-pqr-\u0062\u0308-xyz-\u0063\u0308" # => "ä-pqr-b̈-xyz-c̈"
1676
+ # s.each_grapheme_cluster {|gc| print gc, ' ' }
1677
+ #
1678
+ # Output:
1679
+ #
1680
+ # ä - p q r - b̈ - x y z - c̈
1605
1681
  #
1606
- # "a\u0300".each_char.to_a.size #=> 2
1607
- # "a\u0300".each_grapheme_cluster.to_a.size #=> 1
1682
+ # Returns an enumerator if no block is given.
1608
1683
  #
1609
1684
  def each_grapheme_cluster: () { (String grapheme) -> void } -> self
1610
1685
  | () -> ::Enumerator[String, self]
1611
1686
 
1612
1687
  # <!--
1613
1688
  # rdoc-file=string.c
1614
- # - str.each_line(separator=$/, chomp: false) {|substr| block } -> str
1615
- # - str.each_line(separator=$/, chomp: false) -> an_enumerator
1689
+ # - each_line(line_sep = $/, chomp: false) {|substring| ... } -> self
1690
+ # - each_line(line_sep = $/, chomp: false) -> enumerator
1616
1691
  # -->
1617
- # Splits *str* using the supplied parameter as the record separator (`$/` by
1618
- # default), passing each substring in turn to the supplied block. If a
1619
- # zero-length record separator is supplied, the string is split into paragraphs
1620
- # delimited by multiple successive newlines.
1692
+ # With a block given, forms the substrings ("lines") that are the result of
1693
+ # splitting `self` at each occurrence of the given line separator `line_sep`;
1694
+ # passes each line to the block; returns `self`:
1695
+ #
1696
+ # s = <<~EOT
1697
+ # This is the first line.
1698
+ # This is line two.
1699
+ #
1700
+ # This is line four.
1701
+ # This is line five.
1702
+ # EOT
1703
+ #
1704
+ # s.each_line {|line| p line }
1705
+ #
1706
+ # Output:
1707
+ #
1708
+ # "This is the first line.\n"
1709
+ # "This is line two.\n"
1710
+ # "\n"
1711
+ # "This is line four.\n"
1712
+ # "This is line five.\n"
1621
1713
  #
1622
- # If `chomp` is `true`, `separator` will be removed from the end of each line.
1714
+ # With a different `line_sep`:
1623
1715
  #
1624
- # If no block is given, an enumerator is returned instead.
1716
+ # s.each_line(' is ') {|line| p line }
1625
1717
  #
1626
- # "hello\nworld".each_line {|s| p s}
1627
- # # prints:
1628
- # # "hello\n"
1629
- # # "world"
1718
+ # Output:
1719
+ #
1720
+ # "This is "
1721
+ # "the first line.\nThis is "
1722
+ # "line two.\n\nThis is "
1723
+ # "line four.\nThis is "
1724
+ # "line five.\n"
1630
1725
  #
1631
- # "hello\nworld".each_line('l') {|s| p s}
1632
- # # prints:
1633
- # # "hel"
1634
- # # "l"
1635
- # # "o\nworl"
1636
- # # "d"
1726
+ # With `chomp` as `true`, removes the trailing `line_sep` from each line:
1637
1727
  #
1638
- # "hello\n\n\nworld".each_line('') {|s| p s}
1639
- # # prints
1640
- # # "hello\n\n"
1641
- # # "world"
1728
+ # s.each_line(chomp: true) {|line| p line }
1729
+ #
1730
+ # Output:
1642
1731
  #
1643
- # "hello\nworld".each_line(chomp: true) {|s| p s}
1644
- # # prints:
1645
- # # "hello"
1646
- # # "world"
1732
+ # "This is the first line."
1733
+ # "This is line two."
1734
+ # ""
1735
+ # "This is line four."
1736
+ # "This is line five."
1647
1737
  #
1648
- # "hello\nworld".each_line('l', chomp: true) {|s| p s}
1649
- # # prints:
1650
- # # "he"
1651
- # # ""
1652
- # # "o\nwor"
1653
- # # "d"
1738
+ # With an empty string as `line_sep`, forms and passes "paragraphs" by splitting
1739
+ # at each occurrence of two or more newlines:
1740
+ #
1741
+ # s.each_line('') {|line| p line }
1742
+ #
1743
+ # Output:
1744
+ #
1745
+ # "This is the first line.\nThis is line two.\n\n"
1746
+ # "This is line four.\nThis is line five.\n"
1747
+ #
1748
+ # With no block given, returns an enumerator.
1654
1749
  #
1655
1750
  def each_line: (?string separator, ?chomp: boolish) { (String line) -> void } -> self
1656
1751
  | (?string separator, ?chomp: boolish) -> Enumerator[String, self]
@@ -1668,67 +1763,60 @@ class String
1668
1763
  def empty?: () -> bool
1669
1764
 
1670
1765
  # <!--
1671
- # rdoc-file=transcode.c
1672
- # - str.encode(encoding, **options) -> str
1673
- # - str.encode(dst_encoding, src_encoding, **options) -> str
1674
- # - str.encode(**options) -> str
1675
- # -->
1676
- # The first form returns a copy of `str` transcoded to encoding `encoding`. The
1677
- # second form returns a copy of `str` transcoded from src_encoding to
1678
- # dst_encoding. The last form returns a copy of `str` transcoded to
1679
- # `Encoding.default_internal`.
1680
- #
1681
- # By default, the first and second form raise Encoding::UndefinedConversionError
1682
- # for characters that are undefined in the destination encoding, and
1683
- # Encoding::InvalidByteSequenceError for invalid byte sequences in the source
1684
- # encoding. The last form by default does not raise exceptions but uses
1685
- # replacement strings.
1686
- #
1687
- # The `options` keyword arguments give details for conversion. The arguments
1688
- # are:
1689
- #
1690
- # :invalid
1691
- # : If the value is `:replace`, #encode replaces invalid byte sequences in
1692
- # `str` with the replacement character. The default is to raise the
1693
- # Encoding::InvalidByteSequenceError exception
1694
- # :undef
1695
- # : If the value is `:replace`, #encode replaces characters which are
1696
- # undefined in the destination encoding with the replacement character. The
1697
- # default is to raise the Encoding::UndefinedConversionError.
1698
- # :replace
1699
- # : Sets the replacement string to the given value. The default replacement
1700
- # string is "uFFFD" for Unicode encoding forms, and "?" otherwise.
1701
- # :fallback
1702
- # : Sets the replacement string by the given object for undefined character.
1703
- # The object should be a Hash, a Proc, a Method, or an object which has []
1704
- # method. Its key is an undefined character encoded in the source encoding
1705
- # of current transcoder. Its value can be any encoding until it can be
1706
- # converted into the destination encoding of the transcoder.
1707
- # :xml
1708
- # : The value must be `:text` or `:attr`. If the value is `:text` #encode
1709
- # replaces undefined characters with their (upper-case hexadecimal) numeric
1710
- # character references. '&', '<', and '>' are converted to "&amp;", "&lt;",
1711
- # and "&gt;", respectively. If the value is `:attr`, #encode also quotes the
1712
- # replacement result (using '"'), and replaces '"' with "&quot;".
1713
- # :cr_newline
1714
- # : Replaces LF ("n") with CR ("r") if value is true.
1715
- # :crlf_newline
1716
- # : Replaces LF ("n") with CRLF ("r\n") if value is true.
1717
- # :universal_newline
1718
- # : Replaces CRLF ("r\n") and CR ("r") with LF ("n") if value is true.
1766
+ # rdoc-file=transcode.rdoc
1767
+ # - encode(dst_encoding = Encoding.default_internal, **enc_opts) -> string
1768
+ # - encode(dst_encoding, src_encoding, **enc_opts) -> string
1769
+ # -->
1770
+ # Returns a copy of `self` transcoded as determined by `dst_encoding`. By
1771
+ # default, raises an exception if `self` contains an invalid byte or a character
1772
+ # not defined in `dst_encoding`; that behavior may be modified by encoding
1773
+ # options; see below.
1774
+ #
1775
+ # With no arguments:
1776
+ #
1777
+ # * Uses the same encoding if `Encoding.default_internal` is `nil` (the
1778
+ # default):
1779
+ #
1780
+ # Encoding.default_internal # => nil
1781
+ # s = "Ruby\x99".force_encoding('Windows-1252')
1782
+ # s.encoding # => #<Encoding:Windows-1252>
1783
+ # s.bytes # => [82, 117, 98, 121, 153]
1784
+ # t = s.encode # => "Ruby\x99"
1785
+ # t.encoding # => #<Encoding:Windows-1252>
1786
+ # t.bytes # => [82, 117, 98, 121, 226, 132, 162]
1787
+ #
1788
+ # * Otherwise, uses the encoding `Encoding.default_internal`:
1789
+ #
1790
+ # Encoding.default_internal = 'UTF-8'
1791
+ # t = s.encode # => "Ruby™"
1792
+ # t.encoding # => #<Encoding:UTF-8>
1793
+ #
1794
+ #
1795
+ # With only argument `dst_encoding` given, uses that encoding:
1796
+ #
1797
+ # s = "Ruby\x99".force_encoding('Windows-1252')
1798
+ # s.encoding # => #<Encoding:Windows-1252>
1799
+ # t = s.encode('UTF-8') # => "Ruby™"
1800
+ # t.encoding # => #<Encoding:UTF-8>
1801
+ #
1802
+ # With arguments `dst_encoding` and `src_encoding` given, interprets `self`
1803
+ # using `src_encoding`, encodes the new string using `dst_encoding`:
1804
+ #
1805
+ # s = "Ruby\x99"
1806
+ # t = s.encode('UTF-8', 'Windows-1252') # => "Ruby™"
1807
+ # t.encoding # => #<Encoding:UTF-8>
1808
+ #
1809
+ # Optional keyword arguments `enc_opts` specify encoding options; see [Encoding
1810
+ # Options](rdoc-ref:encodings.rdoc@Encoding+Options).
1719
1811
  #
1720
1812
  def encode: (?encoding encoding, ?encoding from_encoding, ?invalid: :replace ?, ?undef: :replace ?, ?replace: String, ?fallback: String::encode_fallback, ?xml: :text | :attr, ?universal_newline: true, ?cr_newline: true, ?crlf_newline: true) -> String
1721
1813
 
1722
1814
  # <!--
1723
1815
  # rdoc-file=transcode.c
1724
- # - str.encode!(encoding, **options) -> str
1725
- # - str.encode!(dst_encoding, src_encoding, **options) -> str
1816
+ # - encode!(dst_encoding = Encoding.default_internal, **enc_opts) -> self
1817
+ # - encode!(dst_encoding, src_encoding, **enc_opts) -> self
1726
1818
  # -->
1727
- # The first form transcodes the contents of *str* from str.encoding to
1728
- # `encoding`. The second form transcodes the contents of *str* from src_encoding
1729
- # to dst_encoding. The `options` keyword arguments give details for conversion.
1730
- # See String#encode for details. Returns the string even if no changes were
1731
- # made.
1819
+ # Like #encode, but applies encoding changes to `self`; returns `self`.
1732
1820
  #
1733
1821
  def encode!: (?encoding encoding, ?encoding from_encoding, ?invalid: :replace ?, ?undef: :replace ?, ?replace: String, ?fallback: String::encode_fallback, ?xml: :text | :attr, ?universal_newline: true, ?cr_newline: true, ?crlf_newline: true) -> self
1734
1822
 
@@ -1742,15 +1830,19 @@ class String
1742
1830
 
1743
1831
  # <!--
1744
1832
  # rdoc-file=string.c
1745
- # - str.end_with?([suffixes]+) -> true or false
1833
+ # - end_with?(*strings) -> true or false
1746
1834
  # -->
1747
- # Returns true if `str` ends with one of the `suffixes` given.
1835
+ # Returns whether `self` ends with any of the given `strings`.
1836
+ #
1837
+ # Returns `true` if any given string matches the end, `false` otherwise:
1748
1838
  #
1749
- # "hello".end_with?("ello") #=> true
1839
+ # 'hello'.end_with?('ello') #=> true
1840
+ # 'hello'.end_with?('heaven', 'ello') #=> true
1841
+ # 'hello'.end_with?('heaven', 'paradise') #=> false
1842
+ # 'тест'.end_with?('т') # => true
1843
+ # 'こんにちは'.end_with?('は') # => true
1750
1844
  #
1751
- # # returns true if one of the +suffixes+ matches.
1752
- # "hello".end_with?("heaven", "ello") #=> true
1753
- # "hello".end_with?("heaven", "paradise") #=> false
1845
+ # Related: String#start_with?.
1754
1846
  #
1755
1847
  def end_with?: (*string suffixes) -> bool
1756
1848
 
@@ -1774,9 +1866,27 @@ class String
1774
1866
 
1775
1867
  # <!--
1776
1868
  # rdoc-file=string.c
1777
- # - str.force_encoding(encoding) -> str
1869
+ # - force_encoding(encoding) -> self
1778
1870
  # -->
1779
- # Changes the encoding to `encoding` and returns self.
1871
+ # Changes the encoding of `self` to `encoding`, which may be a string encoding
1872
+ # name or an Encoding object; returns self:
1873
+ #
1874
+ # s = 'łał'
1875
+ # s.bytes # => [197, 130, 97, 197, 130]
1876
+ # s.encoding # => #<Encoding:UTF-8>
1877
+ # s.force_encoding('ascii') # => "\xC5\x82a\xC5\x82"
1878
+ # s.encoding # => #<Encoding:US-ASCII>
1879
+ #
1880
+ # Does not change the underlying bytes:
1881
+ #
1882
+ # s.bytes # => [197, 130, 97, 197, 130]
1883
+ #
1884
+ # Makes the change even if the given `encoding` is invalid for `self` (as is the
1885
+ # change above):
1886
+ #
1887
+ # s.valid_encoding? # => false
1888
+ # s.force_encoding(Encoding::UTF_8) # => "łał"
1889
+ # s.valid_encoding? # => true
1780
1890
  #
1781
1891
  def force_encoding: (string | Encoding encoding) -> self
1782
1892
 
@@ -1789,13 +1899,15 @@ class String
1789
1899
 
1790
1900
  # <!--
1791
1901
  # rdoc-file=string.c
1792
- # - getbyte(index) -> integer
1902
+ # - getbyte(index) -> integer or nil
1793
1903
  # -->
1794
- # Returns the byte at zero-based `index` as an integer:
1904
+ # Returns the byte at zero-based `index` as an integer, or `nil` if `index` is
1905
+ # out of range:
1795
1906
  #
1796
- # s = 'abcde' # => "abcde"
1797
- # s.getbyte(0) # => 97
1798
- # s.getbyte(1) # => 98
1907
+ # s = 'abcde' # => "abcde"
1908
+ # s.getbyte(0) # => 97
1909
+ # s.getbyte(-1) # => 101
1910
+ # s.getbyte(5) # => nil
1799
1911
  #
1800
1912
  # Related: String#setbyte.
1801
1913
  #
@@ -1803,13 +1915,16 @@ class String
1803
1915
 
1804
1916
  # <!--
1805
1917
  # rdoc-file=string.c
1806
- # - str.grapheme_clusters -> an_array
1918
+ # - grapheme_clusters -> array_of_grapheme_clusters
1807
1919
  # -->
1808
- # Returns an array of grapheme clusters in *str*. This is a shorthand for
1809
- # `str.each_grapheme_cluster.to_a`.
1920
+ # Returns an array of the grapheme clusters in `self` (see [Unicode Grapheme
1921
+ # Cluster
1922
+ # Boundaries](https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries)
1923
+ # ):
1810
1924
  #
1811
- # If a block is given, which is a deprecated form, works the same as
1812
- # `each_grapheme_cluster`.
1925
+ # s = "\u0061\u0308-pqr-\u0062\u0308-xyz-\u0063\u0308" # => "ä-pqr-b̈-xyz-c̈"
1926
+ # s.grapheme_clusters
1927
+ # # => ["ä", "-", "p", "q", "r", "-", "b̈", "-", "x", "y", "z", "-", "c̈"]
1813
1928
  #
1814
1929
  def grapheme_clusters: () -> ::Array[::String]
1815
1930
 
@@ -1821,7 +1936,7 @@ class String
1821
1936
  # -->
1822
1937
  # Returns a copy of `self` with all occurrences of the given `pattern` replaced.
1823
1938
  #
1824
- # See [Substitution Methods](#class-String-label-Substitution+Methods).
1939
+ # See [Substitution Methods](rdoc-ref:String@Substitution+Methods).
1825
1940
  #
1826
1941
  # Returns an Enumerator if no `replacement` and no block given.
1827
1942
  #
@@ -1841,7 +1956,7 @@ class String
1841
1956
  # Performs the specified substring replacement(s) on `self`; returns `self` if
1842
1957
  # any replacement occurred, `nil` otherwise.
1843
1958
  #
1844
- # See [Substitution Methods](#class-String-label-Substitution+Methods).
1959
+ # See [Substitution Methods](rdoc-ref:String@Substitution+Methods).
1845
1960
  #
1846
1961
  # Returns an Enumerator if no `replacement` and no block given.
1847
1962
  #
@@ -1865,16 +1980,18 @@ class String
1865
1980
 
1866
1981
  # <!--
1867
1982
  # rdoc-file=string.c
1868
- # - str.hex -> integer
1983
+ # - hex -> integer
1869
1984
  # -->
1870
- # Treats leading characters from *str* as a string of hexadecimal digits (with
1871
- # an optional sign and an optional `0x`) and returns the corresponding number.
1872
- # Zero is returned on error.
1985
+ # Interprets the leading substring of `self` as a string of hexadecimal digits
1986
+ # (with an optional sign and an optional `0x`) and returns the corresponding
1987
+ # number; returns zero if there is no such leading substring:
1873
1988
  #
1874
- # "0x0a".hex #=> 10
1875
- # "-1234".hex #=> -4660
1876
- # "0".hex #=> 0
1877
- # "wombat".hex #=> 0
1989
+ # '0x0a'.hex # => 10
1990
+ # '-1234'.hex # => -4660
1991
+ # '0'.hex # => 0
1992
+ # 'non-numeric'.hex # => 0
1993
+ #
1994
+ # Related: String#oct.
1878
1995
  #
1879
1996
  def hex: () -> Integer
1880
1997
 
@@ -1896,35 +2013,42 @@ class String
1896
2013
  # - index(substring, offset = 0) -> integer or nil
1897
2014
  # - index(regexp, offset = 0) -> integer or nil
1898
2015
  # -->
1899
- # Returns the Integer index of the first occurrence of the given `substring`, or
1900
- # `nil` if none found:
2016
+ # Returns the integer index of the first match for the given argument, or `nil`
2017
+ # if none found; the search of `self` is forward, and begins at position
2018
+ # `offset` (in characters).
1901
2019
  #
1902
- # 'foo'.index('f') # => 0
1903
- # 'foo'.index('o') # => 1
1904
- # 'foo'.index('oo') # => 1
1905
- # 'foo'.index('ooo') # => nil
2020
+ # With string argument `substring`, returns the index of the first matching
2021
+ # substring in `self`:
1906
2022
  #
1907
- # Returns the Integer index of the first match for the given Regexp `regexp`, or
1908
- # `nil` if none found:
2023
+ # 'foo'.index('f') # => 0
2024
+ # 'foo'.index('o') # => 1
2025
+ # 'foo'.index('oo') # => 1
2026
+ # 'foo'.index('ooo') # => nil
2027
+ # 'тест'.index('с') # => 2
2028
+ # 'こんにちは'.index('ち') # => 3
1909
2029
  #
1910
- # 'foo'.index(/f/) # => 0
1911
- # 'foo'.index(/o/) # => 1
1912
- # 'foo'.index(/oo/) # => 1
1913
- # 'foo'.index(/ooo/) # => nil
2030
+ # With Regexp argument `regexp`, returns the index of the first match in `self`:
1914
2031
  #
1915
- # Integer argument `offset`, if given, specifies the position in the string to
1916
- # begin the search:
2032
+ # 'foo'.index(/o./) # => 1
2033
+ # 'foo'.index(/.o/) # => 0
1917
2034
  #
1918
- # 'foo'.index('o', 1) # => 1
1919
- # 'foo'.index('o', 2) # => 2
1920
- # 'foo'.index('o', 3) # => nil
2035
+ # With positive integer `offset`, begins the search at position `offset`:
1921
2036
  #
1922
- # If `offset` is negative, counts backward from the end of `self`:
2037
+ # 'foo'.index('o', 1) # => 1
2038
+ # 'foo'.index('o', 2) # => 2
2039
+ # 'foo'.index('o', 3) # => nil
2040
+ # 'тест'.index('с', 1) # => 2
2041
+ # 'こんにちは'.index('ち', 2) # => 3
1923
2042
  #
1924
- # 'foo'.index('o', -1) # => 2
1925
- # 'foo'.index('o', -2) # => 1
1926
- # 'foo'.index('o', -3) # => 1
1927
- # 'foo'.index('o', -4) # => nil
2043
+ # With negative integer `offset`, selects the search position by counting
2044
+ # backward from the end of `self`:
2045
+ #
2046
+ # 'foo'.index('o', -1) # => 2
2047
+ # 'foo'.index('o', -2) # => 1
2048
+ # 'foo'.index('o', -3) # => 1
2049
+ # 'foo'.index('o', -4) # => nil
2050
+ # 'foo'.index(/o./, -2) # => 1
2051
+ # 'foo'.index(/.o/, -2) # => 1
1928
2052
  #
1929
2053
  # Related: String#rindex.
1930
2054
  #
@@ -1955,7 +2079,6 @@ class String
1955
2079
  # special characters escaped:
1956
2080
  #
1957
2081
  # s = "foo\tbar\tbaz\n"
1958
- # # => "foo\tbar\tbaz\n"
1959
2082
  # s.inspect
1960
2083
  # # => "\"foo\\tbar\\tbaz\\n\""
1961
2084
  #
@@ -1988,74 +2111,78 @@ class String
1988
2111
  # -->
1989
2112
  # Returns the count of characters (not bytes) in `self`:
1990
2113
  #
1991
- # "\x80\u3042".length # => 2
1992
- # "hello".length # => 5
2114
+ # 'foo'.length # => 3
2115
+ # 'тест'.length # => 4
2116
+ # 'こんにちは'.length # => 5
1993
2117
  #
1994
- # String#size is an alias for String#length.
2118
+ # Contrast with String#bytesize:
1995
2119
  #
1996
- # Related: String#bytesize.
2120
+ # 'foo'.bytesize # => 3
2121
+ # 'тест'.bytesize # => 8
2122
+ # 'こんにちは'.bytesize # => 15
2123
+ #
2124
+ # String#size is an alias for String#length.
1997
2125
  #
1998
2126
  def length: () -> Integer
1999
2127
 
2000
2128
  # <!--
2001
2129
  # rdoc-file=string.c
2002
- # - str.lines(separator=$/, chomp: false) -> an_array
2130
+ # - lines(Line_sep = $/, chomp: false) -> array_of_strings
2003
2131
  # -->
2004
- # Returns an array of lines in *str* split using the supplied record separator
2005
- # (`$/` by default). This is a shorthand for `str.each_line(separator,
2006
- # getline_args).to_a`.
2007
- #
2008
- # If `chomp` is `true`, `separator` will be removed from the end of each line.
2009
- #
2010
- # "hello\nworld\n".lines #=> ["hello\n", "world\n"]
2011
- # "hello world".lines(' ') #=> ["hello ", " ", "world"]
2012
- # "hello\nworld\n".lines(chomp: true) #=> ["hello", "world"]
2013
- #
2014
- # If a block is given, which is a deprecated form, works the same as
2015
- # `each_line`.
2132
+ # Forms substrings ("lines") of `self` according to the given arguments (see
2133
+ # String#each_line for details); returns the lines in an array.
2016
2134
  #
2017
2135
  def lines: (?string separator, ?chomp: boolish) -> Array[String]
2018
2136
 
2019
2137
  # <!--
2020
2138
  # rdoc-file=string.c
2021
- # - str.ljust(integer, padstr=' ') -> new_str
2139
+ # - ljust(size, pad_string = ' ') -> new_string
2022
2140
  # -->
2023
- # If *integer* is greater than the length of *str*, returns a new String of
2024
- # length *integer* with *str* left justified and padded with *padstr*;
2025
- # otherwise, returns *str*.
2141
+ # Returns a left-justified copy of `self`.
2142
+ #
2143
+ # If integer argument `size` is greater than the size (in characters) of `self`,
2144
+ # returns a new string of length `size` that is a copy of `self`, left justified
2145
+ # and padded on the right with `pad_string`:
2146
+ #
2147
+ # 'hello'.ljust(10) # => "hello "
2148
+ # ' hello'.ljust(10) # => " hello "
2149
+ # 'hello'.ljust(10, 'ab') # => "helloababa"
2150
+ # 'тест'.ljust(10) # => "тест "
2151
+ # 'こんにちは'.ljust(10) # => "こんにちは "
2026
2152
  #
2027
- # "hello".ljust(4) #=> "hello"
2028
- # "hello".ljust(20) #=> "hello "
2029
- # "hello".ljust(20, '1234') #=> "hello123412341234123"
2153
+ # If `size` is not greater than the size of `self`, returns a copy of `self`:
2154
+ #
2155
+ # 'hello'.ljust(5) # => "hello"
2156
+ # 'hello'.ljust(1) # => "hello"
2157
+ #
2158
+ # Related: String#rjust, String#center.
2030
2159
  #
2031
2160
  def ljust: (int integer, ?string padstr) -> String
2032
2161
 
2033
2162
  # <!--
2034
2163
  # rdoc-file=string.c
2035
- # - str.lstrip -> new_str
2164
+ # - lstrip -> new_string
2036
2165
  # -->
2037
- # Returns a copy of the receiver with leading whitespace removed. See also
2038
- # String#rstrip and String#strip.
2166
+ # Returns a copy of `self` with leading whitespace removed; see [Whitespace in
2167
+ # Strings](rdoc-ref:String@Whitespace+in+Strings):
2039
2168
  #
2040
- # Refer to String#strip for the definition of whitespace.
2169
+ # whitespace = "\x00\t\n\v\f\r "
2170
+ # s = whitespace + 'abc' + whitespace
2171
+ # s # => "\u0000\t\n\v\f\r abc\u0000\t\n\v\f\r "
2172
+ # s.lstrip # => "abc\u0000\t\n\v\f\r "
2041
2173
  #
2042
- # " hello ".lstrip #=> "hello "
2043
- # "hello".lstrip #=> "hello"
2174
+ # Related: String#rstrip, String#strip.
2044
2175
  #
2045
2176
  def lstrip: () -> String
2046
2177
 
2047
2178
  # <!--
2048
2179
  # rdoc-file=string.c
2049
- # - str.lstrip! -> self or nil
2180
+ # - lstrip! -> self or nil
2050
2181
  # -->
2051
- # Removes leading whitespace from the receiver. Returns the altered receiver, or
2052
- # `nil` if no change was made. See also String#rstrip! and String#strip!.
2182
+ # Like String#lstrip, except that any modifications are made in `self`; returns
2183
+ # `self` if any modification are made, `nil` otherwise.
2053
2184
  #
2054
- # Refer to String#strip for the definition of whitespace.
2055
- #
2056
- # " hello ".lstrip! #=> "hello "
2057
- # "hello ".lstrip! #=> nil
2058
- # "hello".lstrip! #=> nil
2185
+ # Related: String#rstrip!, String#strip!.
2059
2186
  #
2060
2187
  def lstrip!: () -> self?
2061
2188
 
@@ -2064,10 +2191,9 @@ class String
2064
2191
  # - match(pattern, offset = 0) -> matchdata or nil
2065
2192
  # - match(pattern, offset = 0) {|matchdata| ... } -> object
2066
2193
  # -->
2067
- # Returns a Matchdata object (or `nil`) based on `self` and the given `pattern`.
2194
+ # Returns a MatchData object (or `nil`) based on `self` and the given `pattern`.
2068
2195
  #
2069
- # Note: also updates [Regexp-related global
2070
- # variables](Regexp.html#class-Regexp-label-Special+global+variables).
2196
+ # Note: also updates Regexp@Special+global+variables.
2071
2197
  #
2072
2198
  # * Computes `regexp` by converting `pattern` (if not already a Regexp).
2073
2199
  # regexp = Regexp.new(pattern)
@@ -2105,13 +2231,12 @@ class String
2105
2231
  # Returns `true` or `false` based on whether a match is found for `self` and
2106
2232
  # `pattern`.
2107
2233
  #
2108
- # Note: does not update [Regexp-related global
2109
- # variables](Regexp.html#class-Regexp-label-Special+global+variables).
2234
+ # Note: does not update Regexp@Special+global+variables.
2110
2235
  #
2111
2236
  # Computes `regexp` by converting `pattern` (if not already a Regexp).
2112
2237
  # regexp = Regexp.new(pattern)
2113
2238
  #
2114
- # Returns `true` if `self+.match(regexp)` returns a Matchdata object, `false`
2239
+ # Returns `true` if `self+.match(regexp)` returns a MatchData object, `false`
2115
2240
  # otherwise:
2116
2241
  #
2117
2242
  # 'foo'.match?(/o/) # => true
@@ -2189,43 +2314,64 @@ class String
2189
2314
 
2190
2315
  # <!--
2191
2316
  # rdoc-file=string.c
2192
- # - str.oct -> integer
2317
+ # - oct -> integer
2193
2318
  # -->
2194
- # Treats leading characters of *str* as a string of octal digits (with an
2195
- # optional sign) and returns the corresponding number. Returns 0 if the
2196
- # conversion fails.
2319
+ # Interprets the leading substring of `self` as a string of octal digits (with
2320
+ # an optional sign) and returns the corresponding number; returns zero if there
2321
+ # is no such leading substring:
2322
+ #
2323
+ # '123'.oct # => 83
2324
+ # '-377'.oct # => -255
2325
+ # '0377non-numeric'.oct # => 255
2326
+ # 'non-numeric'.oct # => 0
2197
2327
  #
2198
- # "123".oct #=> 83
2199
- # "-377".oct #=> -255
2200
- # "bad".oct #=> 0
2201
- # "0377bad".oct #=> 255
2328
+ # If `self` starts with `0`, radix indicators are honored; see Kernel#Integer.
2202
2329
  #
2203
- # If `str` starts with `0`, radix indicators are honored. See Kernel#Integer.
2330
+ # Related: String#hex.
2204
2331
  #
2205
2332
  def oct: () -> Integer
2206
2333
 
2207
2334
  # <!--
2208
2335
  # rdoc-file=string.c
2209
- # - str.ord -> integer
2336
+ # - ord -> integer
2210
2337
  # -->
2211
- # Returns the Integer ordinal of a one-character string.
2338
+ # Returns the integer ordinal of the first character of `self`:
2212
2339
  #
2213
- # "a".ord #=> 97
2340
+ # 'h'.ord # => 104
2341
+ # 'hello'.ord # => 104
2342
+ # 'тест'.ord # => 1090
2343
+ # 'こんにちは'.ord # => 12371
2214
2344
  #
2215
2345
  def ord: () -> Integer
2216
2346
 
2217
2347
  # <!--
2218
2348
  # rdoc-file=string.c
2219
- # - str.partition(sep) -> [head, sep, tail]
2220
- # - str.partition(regexp) -> [head, match, tail]
2349
+ # - partition(string_or_regexp) -> [head, match, tail]
2221
2350
  # -->
2222
- # Searches *sep* or pattern (*regexp*) in the string and returns the part before
2223
- # it, the match, and the part after it. If it is not found, returns two empty
2224
- # strings and *str*.
2351
+ # Returns a 3-element array of substrings of `self`.
2352
+ #
2353
+ # Matches a pattern against `self`, scanning from the beginning. The pattern is:
2354
+ #
2355
+ # * `string_or_regexp` itself, if it is a Regexp.
2356
+ # * `Regexp.quote(string_or_regexp)`, if `string_or_regexp` is a string.
2357
+ #
2225
2358
  #
2226
- # "hello".partition("l") #=> ["he", "l", "lo"]
2227
- # "hello".partition("x") #=> ["hello", "", ""]
2228
- # "hello".partition(/.l/) #=> ["h", "el", "lo"]
2359
+ # If the pattern is matched, returns pre-match, first-match, post-match:
2360
+ #
2361
+ # 'hello'.partition('l') # => ["he", "l", "lo"]
2362
+ # 'hello'.partition('ll') # => ["he", "ll", "o"]
2363
+ # 'hello'.partition('h') # => ["", "h", "ello"]
2364
+ # 'hello'.partition('o') # => ["hell", "o", ""]
2365
+ # 'hello'.partition(/l+/) #=> ["he", "ll", "o"]
2366
+ # 'hello'.partition('') # => ["", "", "hello"]
2367
+ # 'тест'.partition('т') # => ["", "т", "ест"]
2368
+ # 'こんにちは'.partition('に') # => ["こん", "に", "ちは"]
2369
+ #
2370
+ # If the pattern is not matched, returns a copy of `self` and two empty strings:
2371
+ #
2372
+ # 'hello'.partition('x') # => ["hello", "", ""]
2373
+ #
2374
+ # Related: String#rpartition, String#split.
2229
2375
  #
2230
2376
  def partition: (Regexp | string sep_or_regexp) -> [ String, String, String ]
2231
2377
 
@@ -2333,102 +2479,123 @@ class String
2333
2479
 
2334
2480
  # <!--
2335
2481
  # rdoc-file=string.c
2336
- # - str.rjust(integer, padstr=' ') -> new_str
2482
+ # - rjust(size, pad_string = ' ') -> new_string
2337
2483
  # -->
2338
- # If *integer* is greater than the length of *str*, returns a new String of
2339
- # length *integer* with *str* right justified and padded with *padstr*;
2340
- # otherwise, returns *str*.
2484
+ # Returns a right-justified copy of `self`.
2485
+ #
2486
+ # If integer argument `size` is greater than the size (in characters) of `self`,
2487
+ # returns a new string of length `size` that is a copy of `self`, right
2488
+ # justified and padded on the left with `pad_string`:
2489
+ #
2490
+ # 'hello'.rjust(10) # => " hello"
2491
+ # 'hello '.rjust(10) # => " hello "
2492
+ # 'hello'.rjust(10, 'ab') # => "ababahello"
2493
+ # 'тест'.rjust(10) # => " тест"
2494
+ # 'こんにちは'.rjust(10) # => " こんにちは"
2341
2495
  #
2342
- # "hello".rjust(4) #=> "hello"
2343
- # "hello".rjust(20) #=> " hello"
2344
- # "hello".rjust(20, '1234') #=> "123412341234123hello"
2496
+ # If `size` is not greater than the size of `self`, returns a copy of `self`:
2497
+ #
2498
+ # 'hello'.rjust(5, 'ab') # => "hello"
2499
+ # 'hello'.rjust(1, 'ab') # => "hello"
2500
+ #
2501
+ # Related: String#ljust, String#center.
2345
2502
  #
2346
2503
  def rjust: (int integer, ?string padstr) -> String
2347
2504
 
2348
2505
  # <!--
2349
2506
  # rdoc-file=string.c
2350
- # - str.rpartition(sep) -> [head, sep, tail]
2351
- # - str.rpartition(regexp) -> [head, match, tail]
2507
+ # - rpartition(sep) -> [head, match, tail]
2352
2508
  # -->
2353
- # Searches *sep* or pattern (*regexp*) in the string from the end of the string,
2354
- # and returns the part before it, the match, and the part after it. If it is not
2355
- # found, returns two empty strings and *str*.
2509
+ # Returns a 3-element array of substrings of `self`.
2356
2510
  #
2357
- # "hello".rpartition("l") #=> ["hel", "l", "o"]
2358
- # "hello".rpartition("x") #=> ["", "", "hello"]
2359
- # "hello".rpartition(/.l/) #=> ["he", "ll", "o"]
2511
+ # Matches a pattern against `self`, scanning backwards from the end. The pattern
2512
+ # is:
2360
2513
  #
2361
- # The match from the end means starting at the possible last position, not the
2362
- # last of longest matches.
2514
+ # * `string_or_regexp` itself, if it is a Regexp.
2515
+ # * `Regexp.quote(string_or_regexp)`, if `string_or_regexp` is a string.
2363
2516
  #
2364
- # "hello".rpartition(/l+/) #=> ["hel", "l", "o"]
2365
2517
  #
2366
- # To partition at the last longest match, needs to combine with negative
2367
- # lookbehind.
2518
+ # If the pattern is matched, returns pre-match, last-match, post-match:
2368
2519
  #
2369
- # "hello".rpartition(/(?<!l)l+/) #=> ["he", "ll", "o"]
2520
+ # 'hello'.rpartition('l') # => ["hel", "l", "o"]
2521
+ # 'hello'.rpartition('ll') # => ["he", "ll", "o"]
2522
+ # 'hello'.rpartition('h') # => ["", "h", "ello"]
2523
+ # 'hello'.rpartition('o') # => ["hell", "o", ""]
2524
+ # 'hello'.rpartition(/l+/) # => ["hel", "l", "o"]
2525
+ # 'hello'.rpartition('') # => ["hello", "", ""]
2526
+ # 'тест'.rpartition('т') # => ["тес", "т", ""]
2527
+ # 'こんにちは'.rpartition('に') # => ["こん", "に", "ちは"]
2370
2528
  #
2371
- # Or String#partition with negative lookforward.
2529
+ # If the pattern is not matched, returns two empty strings and a copy of `self`:
2372
2530
  #
2373
- # "hello".partition(/l+(?!.*l)/) #=> ["he", "ll", "o"]
2531
+ # 'hello'.rpartition('x') # => ["", "", "hello"]
2532
+ #
2533
+ # Related: String#partition, String#split.
2374
2534
  #
2375
2535
  def rpartition: (string | Regexp sep_or_regexp) -> [ String, String, String ]
2376
2536
 
2377
2537
  # <!--
2378
2538
  # rdoc-file=string.c
2379
- # - str.rstrip -> new_str
2539
+ # - rstrip -> new_string
2380
2540
  # -->
2381
- # Returns a copy of the receiver with trailing whitespace removed. See also
2382
- # String#lstrip and String#strip.
2541
+ # Returns a copy of the receiver with trailing whitespace removed; see
2542
+ # [Whitespace in Strings](rdoc-ref:String@Whitespace+in+Strings):
2383
2543
  #
2384
- # Refer to String#strip for the definition of whitespace.
2544
+ # whitespace = "\x00\t\n\v\f\r "
2545
+ # s = whitespace + 'abc' + whitespace
2546
+ # s # => "\u0000\t\n\v\f\r abc\u0000\t\n\v\f\r "
2547
+ # s.rstrip # => "\u0000\t\n\v\f\r abc"
2385
2548
  #
2386
- # " hello ".rstrip #=> " hello"
2387
- # "hello".rstrip #=> "hello"
2549
+ # Related: String#lstrip, String#strip.
2388
2550
  #
2389
2551
  def rstrip: () -> String
2390
2552
 
2391
2553
  # <!--
2392
2554
  # rdoc-file=string.c
2393
- # - str.rstrip! -> self or nil
2555
+ # - rstrip! -> self or nil
2394
2556
  # -->
2395
- # Removes trailing whitespace from the receiver. Returns the altered receiver,
2396
- # or `nil` if no change was made. See also String#lstrip! and String#strip!.
2397
- #
2398
- # Refer to String#strip for the definition of whitespace.
2557
+ # Like String#rstrip, except that any modifications are made in `self`; returns
2558
+ # `self` if any modification are made, `nil` otherwise.
2399
2559
  #
2400
- # " hello ".rstrip! #=> " hello"
2401
- # " hello".rstrip! #=> nil
2402
- # "hello".rstrip! #=> nil
2560
+ # Related: String#lstrip!, String#strip!.
2403
2561
  #
2404
2562
  def rstrip!: () -> self?
2405
2563
 
2406
2564
  # <!--
2407
2565
  # rdoc-file=string.c
2408
- # - str.scan(pattern) -> array
2409
- # - str.scan(pattern) {|match, ...| block } -> str
2566
+ # - scan(string_or_regexp) -> array
2567
+ # - scan(string_or_regexp) {|matches| ... } -> self
2410
2568
  # -->
2411
- # Both forms iterate through *str*, matching the pattern (which may be a Regexp
2412
- # or a String). For each match, a result is generated and either added to the
2413
- # result array or passed to the block. If the pattern contains no groups, each
2414
- # individual result consists of the matched string, `$&`. If the pattern
2415
- # contains groups, each individual result is itself an array containing one
2416
- # entry per group.
2569
+ # Matches a pattern against `self`; the pattern is:
2570
+ #
2571
+ # * `string_or_regexp` itself, if it is a Regexp.
2572
+ # * `Regexp.quote(string_or_regexp)`, if `string_or_regexp` is a string.
2573
+ #
2574
+ #
2575
+ # Iterates through `self`, generating a collection of matching results:
2417
2576
  #
2418
- # a = "cruel world"
2419
- # a.scan(/\w+/) #=> ["cruel", "world"]
2420
- # a.scan(/.../) #=> ["cru", "el ", "wor"]
2421
- # a.scan(/(...)/) #=> [["cru"], ["el "], ["wor"]]
2422
- # a.scan(/(..)(..)/) #=> [["cr", "ue"], ["l ", "wo"]]
2577
+ # * If the pattern contains no groups, each result is the matched string,
2578
+ # `$&`.
2579
+ # * If the pattern contains groups, each result is an array containing one
2580
+ # entry per group.
2423
2581
  #
2424
- # And the block form:
2425
2582
  #
2426
- # a.scan(/\w+/) {|w| print "<<#{w}>> " }
2583
+ # With no block given, returns an array of the results:
2584
+ #
2585
+ # s = 'cruel world'
2586
+ # s.scan(/\w+/) # => ["cruel", "world"]
2587
+ # s.scan(/.../) # => ["cru", "el ", "wor"]
2588
+ # s.scan(/(...)/) # => [["cru"], ["el "], ["wor"]]
2589
+ # s.scan(/(..)(..)/) # => [["cr", "ue"], ["l ", "wo"]]
2590
+ #
2591
+ # With a block given, calls the block with each result; returns `self`:
2592
+ #
2593
+ # s.scan(/\w+/) {|w| print "<<#{w}>> " }
2427
2594
  # print "\n"
2428
- # a.scan(/(.)(.)/) {|x,y| print y, x }
2595
+ # s.scan(/(.)(.)/) {|x,y| print y, x }
2429
2596
  # print "\n"
2430
2597
  #
2431
- # *produces:*
2598
+ # Output:
2432
2599
  #
2433
2600
  # <<cruel>> <<world>>
2434
2601
  # rceu lowlr
@@ -2438,34 +2605,44 @@ class String
2438
2605
 
2439
2606
  # <!--
2440
2607
  # rdoc-file=string.c
2441
- # - str.scrub -> new_str
2442
- # - str.scrub(repl) -> new_str
2443
- # - str.scrub{|bytes|} -> new_str
2608
+ # - scrub(replacement_string = default_replacement) -> new_string
2609
+ # - scrub{|bytes| ... } -> new_string
2444
2610
  # -->
2445
- # If the string is invalid byte sequence then replace invalid bytes with given
2446
- # replacement character, else returns self. If block is given, replace invalid
2447
- # bytes with returned value of the block.
2611
+ # Returns a copy of `self` with each invalid byte sequence replaced by the given
2612
+ # `replacement_string`.
2613
+ #
2614
+ # With no block given and no argument, replaces each invalid sequence with the
2615
+ # default replacement string (`"�"` for a Unicode encoding, `'?'` otherwise):
2616
+ #
2617
+ # s = "foo\x81\x81bar"
2618
+ # s.scrub # => "foo��bar"
2448
2619
  #
2449
- # "abc\u3042\x81".scrub #=> "abc\u3042\uFFFD"
2450
- # "abc\u3042\x81".scrub("*") #=> "abc\u3042*"
2451
- # "abc\u3042\xE3\x80".scrub{|bytes| '<'+bytes.unpack1('H*')+'>' } #=> "abc\u3042<e380>"
2620
+ # With no block given and argument `replacement_string` given, replaces each
2621
+ # invalid sequence with that string:
2622
+ #
2623
+ # "foo\x81\x81bar".scrub('xyzzy') # => "fooxyzzyxyzzybar"
2624
+ #
2625
+ # With a block given, replaces each invalid sequence with the value of the
2626
+ # block:
2627
+ #
2628
+ # "foo\x81\x81bar".scrub {|bytes| p bytes; 'XYZZY' }
2629
+ # # => "fooXYZZYXYZZYbar"
2630
+ #
2631
+ # Output:
2632
+ #
2633
+ # "\x81"
2634
+ # "\x81"
2452
2635
  #
2453
2636
  def scrub: (?string repl) -> String
2454
2637
  | () { (String bytes) -> string } -> String
2455
2638
 
2456
2639
  # <!--
2457
2640
  # rdoc-file=string.c
2458
- # - str.scrub! -> str
2459
- # - str.scrub!(repl) -> str
2460
- # - str.scrub!{|bytes|} -> str
2641
+ # - scrub! -> self
2642
+ # - scrub!(replacement_string = default_replacement) -> self
2643
+ # - scrub!{|bytes| ... } -> self
2461
2644
  # -->
2462
- # If the string is invalid byte sequence then replace invalid bytes with given
2463
- # replacement character, else returns self. If block is given, replace invalid
2464
- # bytes with returned value of the block.
2465
- #
2466
- # "abc\u3042\x81".scrub! #=> "abc\u3042\uFFFD"
2467
- # "abc\u3042\x81".scrub!("*") #=> "abc\u3042*"
2468
- # "abc\u3042\xE3\x80".scrub!{|bytes| '<'+bytes.unpack1('H*')+'>' } #=> "abc\u3042<e380>"
2645
+ # Like String#scrub, except that any replacements are made in `self`.
2469
2646
  #
2470
2647
  def scrub!: (?string repl) -> self
2471
2648
  | () { (String bytes) -> string } -> self
@@ -2487,96 +2664,23 @@ class String
2487
2664
  # <!-- rdoc-file=string.c -->
2488
2665
  # Returns the count of characters (not bytes) in `self`:
2489
2666
  #
2490
- # "\x80\u3042".length # => 2
2491
- # "hello".length # => 5
2667
+ # 'foo'.length # => 3
2668
+ # 'тест'.length # => 4
2669
+ # 'こんにちは'.length # => 5
2492
2670
  #
2493
- # String#size is an alias for String#length.
2671
+ # Contrast with String#bytesize:
2672
+ #
2673
+ # 'foo'.bytesize # => 3
2674
+ # 'тест'.bytesize # => 8
2675
+ # 'こんにちは'.bytesize # => 15
2494
2676
  #
2495
- # Related: String#bytesize.
2677
+ # String#size is an alias for String#length.
2496
2678
  #
2497
2679
  alias size length
2498
2680
 
2499
2681
  # <!-- rdoc-file=string.c -->
2500
- # Returns the substring of `self` specified by the arguments.
2501
- #
2502
- # When the single Integer argument `index` is given, returns the 1-character
2503
- # substring found in `self` at offset `index`:
2504
- #
2505
- # 'bar'[2] # => "r"
2506
- #
2507
- # Counts backward from the end of `self` if `index` is negative:
2508
- #
2509
- # 'foo'[-3] # => "f"
2510
- #
2511
- # Returns `nil` if `index` is out of range:
2512
- #
2513
- # 'foo'[3] # => nil
2514
- # 'foo'[-4] # => nil
2515
- #
2516
- # When the two Integer arguments `start` and `length` are given, returns the
2517
- # substring of the given `length` found in `self` at offset `start`:
2518
- #
2519
- # 'foo'[0, 2] # => "fo"
2520
- # 'foo'[0, 0] # => ""
2521
- #
2522
- # Counts backward from the end of `self` if `start` is negative:
2523
- #
2524
- # 'foo'[-2, 2] # => "oo"
2525
- #
2526
- # Special case: returns a new empty String if `start` is equal to the length of
2527
- # `self`:
2528
- #
2529
- # 'foo'[3, 2] # => ""
2530
- #
2531
- # Returns `nil` if `start` is out of range:
2532
- #
2533
- # 'foo'[4, 2] # => nil
2534
- # 'foo'[-4, 2] # => nil
2535
- #
2536
- # Returns the trailing substring of `self` if `length` is large:
2537
- #
2538
- # 'foo'[1, 50] # => "oo"
2539
- #
2540
- # Returns `nil` if `length` is negative:
2541
- #
2542
- # 'foo'[0, -1] # => nil
2543
- #
2544
- # When the single Range argument `range` is given, derives `start` and `length`
2545
- # values from the given `range`, and returns values as above:
2546
- #
2547
- # * `'foo'[0..1]` is equivalent to `'foo'[0, 2]`.
2548
- # * `'foo'[0...1]` is equivalent to `'foo'[0, 1]`.
2549
- #
2550
- #
2551
- # When the Regexp argument `regexp` is given, and the `capture` argument is `0`,
2552
- # returns the first matching substring found in `self`, or `nil` if none found:
2553
- #
2554
- # 'foo'[/o/] # => "o"
2555
- # 'foo'[/x/] # => nil
2556
- # s = 'hello there'
2557
- # s[/[aeiou](.)\1/] # => "ell"
2558
- # s[/[aeiou](.)\1/, 0] # => "ell"
2559
- #
2560
- # If argument `capture` is given and not `0`, it should be either an Integer
2561
- # capture group index or a String or Symbol capture group name; the method call
2562
- # returns only the specified capture (see [Regexp
2563
- # Capturing](Regexp.html#class-Regexp-label-Capturing)):
2564
- #
2565
- # s = 'hello there'
2566
- # s[/[aeiou](.)\1/, 1] # => "l"
2567
- # s[/(?<vowel>[aeiou])(?<non_vowel>[^aeiou])/, "non_vowel"] # => "l"
2568
- # s[/(?<vowel>[aeiou])(?<non_vowel>[^aeiou])/, :vowel] # => "e"
2569
- #
2570
- # If an invalid capture group index is given, `nil` is returned. If an invalid
2571
- # capture group name is given, `IndexError` is raised.
2572
- #
2573
- # When the single String argument `substring` is given, returns the substring
2574
- # from `self` if found, otherwise `nil`:
2575
- #
2576
- # 'foo'['oo'] # => "oo"
2577
- # 'foo'['xx'] # => nil
2578
- #
2579
- # String#slice is an alias for String#[].
2682
+ # Returns the substring of `self` specified by the arguments. See examples at
2683
+ # [String Slices](rdoc-ref:String@String+Slices).
2580
2684
  #
2581
2685
  alias slice []
2582
2686
 
@@ -2588,10 +2692,8 @@ class String
2588
2692
  # - slice!(regexp, capture = 0) -> new_string or nil
2589
2693
  # - slice!(substring) -> new_string or nil
2590
2694
  # -->
2591
- # Removes the substring of `self` specified by the arguments; returns the
2592
- # removed substring.
2593
- #
2594
- # See String#[] for details about the arguments that specify the substring.
2695
+ # Removes and returns the substring of `self` specified by the arguments. See
2696
+ # [String Slices](rdoc-ref:String@String+Slices).
2595
2697
  #
2596
2698
  # A few examples:
2597
2699
  #
@@ -2609,66 +2711,104 @@ class String
2609
2711
 
2610
2712
  # <!--
2611
2713
  # rdoc-file=string.c
2612
- # - str.split(pattern=nil, [limit]) -> an_array
2613
- # - str.split(pattern=nil, [limit]) {|sub| block } -> str
2714
+ # - split(field_sep = $;, limit = nil) -> array
2715
+ # - split(field_sep = $;, limit = nil) {|substring| ... } -> self
2614
2716
  # -->
2615
- # Divides *str* into substrings based on a delimiter, returning an array of
2616
- # these substrings.
2717
+ # Returns an array of substrings of `self` that are the result of splitting
2718
+ # `self` at each occurrence of the given field separator `field_sep`.
2719
+ #
2720
+ # When `field_sep` is `$;`:
2721
+ #
2722
+ # * If `$;` is `nil` (its default value), the split occurs just as if
2723
+ # `field_sep` were given as a space character (see below).
2724
+ #
2725
+ # * If `$;` is a string, the split ocurs just as if `field_sep` were given as
2726
+ # that string (see below).
2727
+ #
2728
+ #
2729
+ # When `field_sep` is `' '` and `limit` is `nil`, the split occurs at each
2730
+ # sequence of whitespace:
2731
+ #
2732
+ # 'abc def ghi'.split(' ') => ["abc", "def", "ghi"]
2733
+ # "abc \n\tdef\t\n ghi".split(' ') # => ["abc", "def", "ghi"]
2734
+ # 'abc def ghi'.split(' ') => ["abc", "def", "ghi"]
2735
+ # ''.split(' ') => []
2736
+ #
2737
+ # When `field_sep` is a string different from `' '` and `limit` is `nil`, the
2738
+ # split occurs at each occurrence of `field_sep`; trailing empty substrings are
2739
+ # not returned:
2740
+ #
2741
+ # 'abracadabra'.split('ab') => ["", "racad", "ra"]
2742
+ # 'aaabcdaaa'.split('a') => ["", "", "", "bcd"]
2743
+ # ''.split('a') => []
2744
+ # '3.14159'.split('1') => ["3.", "4", "59"]
2745
+ # '!@#$%^$&*($)_+'.split('$') # => ["!@#", "%^", "&*(", ")_+"]
2746
+ # 'тест'.split('т') => ["", "ес"]
2747
+ # 'こんにちは'.split('に') => ["こん", "ちは"]
2748
+ #
2749
+ # When `field_sep` is a Regexp and `limit` is `nil`, the split occurs at each
2750
+ # occurrence of a match; trailing empty substrings are not returned:
2751
+ #
2752
+ # 'abracadabra'.split(/ab/) # => ["", "racad", "ra"]
2753
+ # 'aaabcdaaa'.split(/a/) => ["", "", "", "bcd"]
2754
+ # 'aaabcdaaa'.split(//) => ["a", "a", "a", "b", "c", "d", "a", "a", "a"]
2755
+ # '1 + 1 == 2'.split(/\W+/) # => ["1", "1", "2"]
2617
2756
  #
2618
- # If *pattern* is a String, then its contents are used as the delimiter when
2619
- # splitting *str*. If *pattern* is a single space, *str* is split on whitespace,
2620
- # with leading and trailing whitespace and runs of contiguous whitespace
2621
- # characters ignored.
2757
+ # If the Regexp contains groups, their matches are also included in the returned
2758
+ # array:
2622
2759
  #
2623
- # If *pattern* is a Regexp, *str* is divided where the pattern matches. Whenever
2624
- # the pattern matches a zero-length string, *str* is split into individual
2625
- # characters. If *pattern* contains groups, the respective matches will be
2626
- # returned in the array as well.
2760
+ # '1:2:3'.split(/(:)()()/, 2) # => ["1", ":", "", "", "2:3"]
2627
2761
  #
2628
- # If *pattern* is `nil`, the value of `$;` is used. If `$;` is `nil` (which is
2629
- # the default), *str* is split on whitespace as if ' ' were specified.
2762
+ # As seen above, if `limit` is `nil`, trailing empty substrings are not
2763
+ # returned; the same is true if `limit` is zero:
2630
2764
  #
2631
- # If the *limit* parameter is omitted, trailing null fields are suppressed. If
2632
- # *limit* is a positive number, at most that number of split substrings will be
2633
- # returned (captured groups will be returned as well, but are not counted
2634
- # towards the limit). If *limit* is `1`, the entire string is returned as the
2635
- # only entry in an array. If negative, there is no limit to the number of fields
2636
- # returned, and trailing null fields are not suppressed.
2765
+ # 'aaabcdaaa'.split('a') => ["", "", "", "bcd"]
2766
+ # 'aaabcdaaa'.split('a', 0) # => ["", "", "", "bcd"]
2637
2767
  #
2638
- # When the input `str` is empty an empty Array is returned as the string is
2639
- # considered to have no fields to split.
2768
+ # If `limit` is positive integer `n`, no more than `n - 1-` splits occur, so
2769
+ # that at most `n` substrings are returned, and trailing empty substrings are
2770
+ # included:
2640
2771
  #
2641
- # " now's the time ".split #=> ["now's", "the", "time"]
2642
- # " now's the time ".split(' ') #=> ["now's", "the", "time"]
2643
- # " now's the time".split(/ /) #=> ["", "now's", "", "the", "time"]
2644
- # "1, 2.34,56, 7".split(%r{,\s*}) #=> ["1", "2.34", "56", "7"]
2645
- # "hello".split(//) #=> ["h", "e", "l", "l", "o"]
2646
- # "hello".split(//, 3) #=> ["h", "e", "llo"]
2647
- # "hi mom".split(%r{\s*}) #=> ["h", "i", "m", "o", "m"]
2772
+ # 'aaabcdaaa'.split('a', 1) # => ["aaabcdaaa"]
2773
+ # 'aaabcdaaa'.split('a', 2) # => ["", "aabcdaaa"]
2774
+ # 'aaabcdaaa'.split('a', 5) # => ["", "", "", "bcd", "aa"]
2775
+ # 'aaabcdaaa'.split('a', 7) # => ["", "", "", "bcd", "", "", ""]
2776
+ # 'aaabcdaaa'.split('a', 8) # => ["", "", "", "bcd", "", "", ""]
2648
2777
  #
2649
- # "mellow yellow".split("ello") #=> ["m", "w y", "w"]
2650
- # "1,2,,3,4,,".split(',') #=> ["1", "2", "", "3", "4"]
2651
- # "1,2,,3,4,,".split(',', 4) #=> ["1", "2", "", "3,4,,"]
2652
- # "1,2,,3,4,,".split(',', -4) #=> ["1", "2", "", "3", "4", "", ""]
2778
+ # Note that if `field_sep` is a Regexp containing groups, their matches are in
2779
+ # the returned array, but do not count toward the limit.
2653
2780
  #
2654
- # "1:2:3".split(/(:)()()/, 2) #=> ["1", ":", "", "", "2:3"]
2781
+ # If `limit` is negative, it behaves the same as if `limit` was `nil`, meaning
2782
+ # that there is no limit, and trailing empty substrings are included:
2655
2783
  #
2656
- # "".split(',', -1) #=> []
2784
+ # 'aaabcdaaa'.split('a', -1) # => ["", "", "", "bcd", "", "", ""]
2657
2785
  #
2658
- # If a block is given, invoke the block with each split substring.
2786
+ # If a block is given, it is called with each substring:
2787
+ #
2788
+ # 'abc def ghi'.split(' ') {|substring| p substring }
2789
+ #
2790
+ # Output:
2791
+ #
2792
+ # "abc"
2793
+ # "def"
2794
+ # "ghi"
2795
+ #
2796
+ # Related: String#partition, String#rpartition.
2659
2797
  #
2660
2798
  def split: (?Regexp | string pattern, ?int limit) -> Array[String]
2661
2799
  | (?Regexp | string pattern, ?int limit) { (String) -> void } -> self
2662
2800
 
2663
2801
  # <!--
2664
2802
  # rdoc-file=string.c
2665
- # - str.squeeze([other_str]*) -> new_str
2803
+ # - squeeze(*selectors) -> new_string
2666
2804
  # -->
2667
- # Builds a set of characters from the *other_str* parameter(s) using the
2668
- # procedure described for String#count. Returns a new string where runs of the
2669
- # same character that occur in this set are replaced by a single character. If
2670
- # no arguments are given, all runs of identical characters are replaced by a
2671
- # single character.
2805
+ # Returns a copy of `self` with characters specified by `selectors` "squeezed"
2806
+ # (see [Multiple Character
2807
+ # Selectors](rdoc-ref:character_selectors.rdoc@Multiple+Character+Selectors)):
2808
+ #
2809
+ # "Squeezed" means that each multiple-character run of a selected character is
2810
+ # squeezed down to a single character; with no arguments given, squeezes all
2811
+ # characters:
2672
2812
  #
2673
2813
  # "yellow moon".squeeze #=> "yelow mon"
2674
2814
  # " now is the".squeeze(" ") #=> " now is the"
@@ -2678,56 +2818,63 @@ class String
2678
2818
 
2679
2819
  # <!--
2680
2820
  # rdoc-file=string.c
2681
- # - str.squeeze!([other_str]*) -> str or nil
2821
+ # - squeeze!(*selectors) -> self or nil
2682
2822
  # -->
2683
- # Squeezes *str* in place, returning either *str*, or `nil` if no changes were
2684
- # made.
2823
+ # Like String#squeeze, but modifies `self` in place. Returns `self` if any
2824
+ # changes were made, `nil` otherwise.
2685
2825
  #
2686
2826
  def squeeze!: (*string other_str) -> self?
2687
2827
 
2688
2828
  # <!--
2689
2829
  # rdoc-file=string.c
2690
- # - str.start_with?([prefixes]+) -> true or false
2830
+ # - start_with?(*string_or_regexp) -> true or false
2691
2831
  # -->
2692
- # Returns true if `str` starts with one of the `prefixes` given. Each of the
2693
- # `prefixes` should be a String or a Regexp.
2832
+ # Returns whether `self` starts with any of the given `string_or_regexp`.
2833
+ #
2834
+ # Matches patterns against the beginning of `self`. For each given
2835
+ # `string_or_regexp`, the pattern is:
2694
2836
  #
2695
- # "hello".start_with?("hell") #=> true
2696
- # "hello".start_with?(/H/i) #=> true
2837
+ # * `string_or_regexp` itself, if it is a Regexp.
2838
+ # * `Regexp.quote(string_or_regexp)`, if `string_or_regexp` is a string.
2697
2839
  #
2698
- # # returns true if one of the prefixes matches.
2699
- # "hello".start_with?("heaven", "hell") #=> true
2700
- # "hello".start_with?("heaven", "paradise") #=> false
2840
+ #
2841
+ # Returns `true` if any pattern matches the beginning, `false` otherwise:
2842
+ #
2843
+ # 'hello'.start_with?('hell') # => true
2844
+ # 'hello'.start_with?(/H/i) # => true
2845
+ # 'hello'.start_with?('heaven', 'hell') # => true
2846
+ # 'hello'.start_with?('heaven', 'paradise') # => false
2847
+ # 'тест'.start_with?('т') # => true
2848
+ # 'こんにちは'.start_with?('こ') # => true
2849
+ #
2850
+ # Related: String#end_with?.
2701
2851
  #
2702
2852
  def start_with?: (*string prefixes) -> bool
2703
2853
 
2704
2854
  # <!--
2705
2855
  # rdoc-file=string.c
2706
- # - str.strip -> new_str
2856
+ # - strip -> new_string
2707
2857
  # -->
2708
- # Returns a copy of the receiver with leading and trailing whitespace removed.
2858
+ # Returns a copy of the receiver with leading and trailing whitespace removed;
2859
+ # see [Whitespace in Strings](rdoc-ref:String@Whitespace+in+Strings):
2709
2860
  #
2710
- # Whitespace is defined as any of the following characters: null, horizontal
2711
- # tab, line feed, vertical tab, form feed, carriage return, space.
2861
+ # whitespace = "\x00\t\n\v\f\r "
2862
+ # s = whitespace + 'abc' + whitespace
2863
+ # s # => "\u0000\t\n\v\f\r abc\u0000\t\n\v\f\r "
2864
+ # s.strip # => "abc"
2712
2865
  #
2713
- # " hello ".strip #=> "hello"
2714
- # "\tgoodbye\r\n".strip #=> "goodbye"
2715
- # "\x00\t\n\v\f\r ".strip #=> ""
2716
- # "hello".strip #=> "hello"
2866
+ # Related: String#lstrip, String#rstrip.
2717
2867
  #
2718
2868
  def strip: () -> String
2719
2869
 
2720
2870
  # <!--
2721
2871
  # rdoc-file=string.c
2722
- # - str.strip! -> self or nil
2872
+ # - strip! -> self or nil
2723
2873
  # -->
2724
- # Removes leading and trailing whitespace from the receiver. Returns the altered
2725
- # receiver, or `nil` if there was no change.
2874
+ # Like String#strip, except that any modifications are made in `self`; returns
2875
+ # `self` if any modification are made, `nil` otherwise.
2726
2876
  #
2727
- # Refer to String#strip for the definition of whitespace.
2728
- #
2729
- # " hello ".strip! #=> "hello"
2730
- # "hello".strip! #=> nil
2877
+ # Related: String#lstrip!, String#strip!.
2731
2878
  #
2732
2879
  def strip!: () -> self?
2733
2880
 
@@ -2739,7 +2886,7 @@ class String
2739
2886
  # Returns a copy of `self` with only the first occurrence (not all occurrences)
2740
2887
  # of the given `pattern` replaced.
2741
2888
  #
2742
- # See [Substitution Methods](#class-String-label-Substitution+Methods).
2889
+ # See [Substitution Methods](rdoc-ref:String@Substitution+Methods).
2743
2890
  #
2744
2891
  # Related: String#sub!, String#gsub, String#gsub!.
2745
2892
  #
@@ -2754,7 +2901,7 @@ class String
2754
2901
  # Returns `self` with only the first occurrence (not all occurrences) of the
2755
2902
  # given `pattern` replaced.
2756
2903
  #
2757
- # See [Substitution Methods](#class-String-label-Substitution+Methods).
2904
+ # See [Substitution Methods](rdoc-ref:String@Substitution+Methods).
2758
2905
  #
2759
2906
  # Related: String#sub, String#gsub, String#gsub!.
2760
2907
  #
@@ -2832,12 +2979,18 @@ class String
2832
2979
 
2833
2980
  # <!--
2834
2981
  # rdoc-file=string.c
2835
- # - str.sum(n=16) -> integer
2982
+ # - sum(n = 16) -> integer
2836
2983
  # -->
2837
- # Returns a basic *n*-bit checksum of the characters in *str*, where *n* is the
2838
- # optional Integer parameter, defaulting to 16. The result is simply the sum of
2839
- # the binary value of each byte in *str* modulo `2**n - 1`. This is not a
2840
- # particularly good checksum.
2984
+ # Returns a basic `n`-bit checksum of the characters in `self`; the checksum is
2985
+ # the sum of the binary value of each byte in `self`, modulo `2**n - 1`:
2986
+ #
2987
+ # 'hello'.sum # => 532
2988
+ # 'hello'.sum(4) # => 4
2989
+ # 'hello'.sum(64) # => 532
2990
+ # 'тест'.sum # => 1405
2991
+ # 'こんにちは'.sum # => 2582
2992
+ #
2993
+ # This is not a particularly strong checksum.
2841
2994
  #
2842
2995
  def sum: (?int n) -> Integer
2843
2996
 
@@ -2852,7 +3005,7 @@ class String
2852
3005
  # s.swapcase # => "hELLO wORLD!"
2853
3006
  #
2854
3007
  # The casing may be affected by the given `options`; see [Case
2855
- # Mapping](doc/case_mapping_rdoc.html).
3008
+ # Mapping](rdoc-ref:case_mapping.rdoc).
2856
3009
  #
2857
3010
  # Related: String#swapcase!.
2858
3011
  #
@@ -2870,11 +3023,11 @@ class String
2870
3023
  #
2871
3024
  # s = 'Hello World!' # => "Hello World!"
2872
3025
  # s.swapcase! # => "hELLO wORLD!"
2873
- # s # => "Hello World!"
3026
+ # s # => "hELLO wORLD!"
2874
3027
  # ''.swapcase! # => nil
2875
3028
  #
2876
3029
  # The casing may be affected by the given `options`; see [Case
2877
- # Mapping](doc/case_mapping_rdoc.html).
3030
+ # Mapping](rdoc-ref:case_mapping.rdoc).
2878
3031
  #
2879
3032
  # Related: String#swapcase.
2880
3033
  #
@@ -2903,6 +3056,12 @@ class String
2903
3056
  # '1/2+3/4i'.to_c #=> ((1/2)+(3/4)*i)
2904
3057
  # 'ruby'.to_c #=> (0+0i)
2905
3058
  #
3059
+ # Polar form:
3060
+ # include Math
3061
+ # "1.0@0".to_c #=> (1+0.0i)
3062
+ # "1.0@#{PI/2}".to_c #=> (0.0+1i)
3063
+ # "1.0@#{PI}".to_c #=> (-1+0.0i)
3064
+ #
2906
3065
  # See Kernel.Complex.
2907
3066
  #
2908
3067
  def to_c: () -> Complex
@@ -2931,11 +3090,21 @@ class String
2931
3090
  # - to_i(base = 10) -> integer
2932
3091
  # -->
2933
3092
  # Returns the result of interpreting leading characters in `self` as an integer
2934
- # in the given `base` (which must be in (2..36)):
3093
+ # in the given `base` (which must be in (0, 2..36)):
2935
3094
  #
2936
3095
  # '123456'.to_i # => 123456
2937
3096
  # '123def'.to_i(16) # => 1195503
2938
3097
  #
3098
+ # With `base` zero, string `object` may contain leading characters to specify
3099
+ # the actual base:
3100
+ #
3101
+ # '123def'.to_i(0) # => 123
3102
+ # '0123def'.to_i(0) # => 83
3103
+ # '0b123def'.to_i(0) # => 1
3104
+ # '0o123def'.to_i(0) # => 83
3105
+ # '0d123def'.to_i(0) # => 123
3106
+ # '0x123def'.to_i(0) # => 1195503
3107
+ #
2939
3108
  # Characters past a leading valid number (in the given `base`) are ignored:
2940
3109
  #
2941
3110
  # '12.345'.to_i # => 12
@@ -3015,67 +3184,76 @@ class String
3015
3184
 
3016
3185
  # <!--
3017
3186
  # rdoc-file=string.c
3018
- # - str.tr(from_str, to_str) => new_str
3187
+ # - tr(selector, replacements) -> new_string
3019
3188
  # -->
3020
- # Returns a copy of `str` with the characters in `from_str` replaced by the
3021
- # corresponding characters in `to_str`. If `to_str` is shorter than `from_str`,
3022
- # it is padded with its last character in order to maintain the correspondence.
3189
+ # Returns a copy of `self` with each character specified by string `selector`
3190
+ # translated to the corresponding character in string `replacements`. The
3191
+ # correspondence is *positional*:
3192
+ #
3193
+ # * Each occurrence of the first character specified by `selector` is
3194
+ # translated to the first character in `replacements`.
3195
+ # * Each occurrence of the second character specified by `selector` is
3196
+ # translated to the second character in `replacements`.
3197
+ # * And so on.
3023
3198
  #
3024
- # "hello".tr('el', 'ip') #=> "hippo"
3025
- # "hello".tr('aeiou', '*') #=> "h*ll*"
3026
- # "hello".tr('aeiou', 'AA*') #=> "hAll*"
3027
3199
  #
3028
- # Both strings may use the `c1-c2` notation to denote ranges of characters, and
3029
- # `from_str` may start with a `^`, which denotes all characters except those
3030
- # listed.
3200
+ # Example:
3031
3201
  #
3032
- # "hello".tr('a-y', 'b-z') #=> "ifmmp"
3033
- # "hello".tr('^aeiou', '*') #=> "*e**o"
3202
+ # 'hello'.tr('el', 'ip') #=> "hippo"
3034
3203
  #
3035
- # The backslash character `\` can be used to escape `^` or `-` and is otherwise
3036
- # ignored unless it appears at the end of a range or the end of the `from_str`
3037
- # or `to_str`:
3204
+ # If `replacements` is shorter than `selector`, it is implicitly padded with its
3205
+ # own last character:
3038
3206
  #
3039
- # "hello^world".tr("\\^aeiou", "*") #=> "h*ll**w*rld"
3040
- # "hello-world".tr("a\\-eo", "*") #=> "h*ll**w*rld"
3207
+ # 'hello'.tr('aeiou', '-') # => "h-ll-"
3208
+ # 'hello'.tr('aeiou', 'AA-') # => "hAll-"
3041
3209
  #
3042
- # "hello\r\nworld".tr("\r", "") #=> "hello\nworld"
3043
- # "hello\r\nworld".tr("\\r", "") #=> "hello\r\nwold"
3044
- # "hello\r\nworld".tr("\\\r", "") #=> "hello\nworld"
3210
+ # Arguments `selector` and `replacements` must be valid character selectors (see
3211
+ # [Character Selectors](rdoc-ref:character_selectors.rdoc)), and may use any of
3212
+ # its valid forms, including negation, ranges, and escaping:
3045
3213
  #
3046
- # "X['\\b']".tr("X\\", "") #=> "['b']"
3047
- # "X['\\b']".tr("X-\\]", "") #=> "'b'"
3214
+ # # Negation.
3215
+ # 'hello'.tr('^aeiou', '-') # => "-e--o"
3216
+ # # Ranges.
3217
+ # 'ibm'.tr('b-z', 'a-z') # => "hal"
3218
+ # # Escapes.
3219
+ # 'hel^lo'.tr('\^aeiou', '-') # => "h-l-l-" # Escaped leading caret.
3220
+ # 'i-b-m'.tr('b\-z', 'a-z') # => "ibabm" # Escaped embedded hyphen.
3221
+ # 'foo\\bar'.tr('ab\\', 'XYZ') # => "fooZYXr" # Escaped backslash.
3048
3222
  #
3049
3223
  def tr: (string from_str, string to_str) -> String
3050
3224
 
3051
3225
  # <!--
3052
3226
  # rdoc-file=string.c
3053
- # - str.tr!(from_str, to_str) -> str or nil
3227
+ # - tr!(selector, replacements) -> self or nil
3054
3228
  # -->
3055
- # Translates *str* in place, using the same rules as String#tr. Returns *str*,
3056
- # or `nil` if no changes were made.
3229
+ # Like String#tr, but modifies `self` in place. Returns `self` if any changes
3230
+ # were made, `nil` otherwise.
3057
3231
  #
3058
3232
  def tr!: (string from_str, string to_str) -> String?
3059
3233
 
3060
3234
  # <!--
3061
3235
  # rdoc-file=string.c
3062
- # - str.tr_s(from_str, to_str) -> new_str
3236
+ # - tr_s(selector, replacements) -> string
3063
3237
  # -->
3064
- # Processes a copy of *str* as described under String#tr, then removes duplicate
3065
- # characters in regions that were affected by the translation.
3238
+ # Like String#tr, but also squeezes the modified portions of the translated
3239
+ # string; returns a new string (translated and squeezed).
3066
3240
  #
3067
- # "hello".tr_s('l', 'r') #=> "hero"
3068
- # "hello".tr_s('el', '*') #=> "h*o"
3069
- # "hello".tr_s('el', 'hx') #=> "hhxo"
3241
+ # 'hello'.tr_s('l', 'r') #=> "hero"
3242
+ # 'hello'.tr_s('el', '-') #=> "h-o"
3243
+ # 'hello'.tr_s('el', 'hx') #=> "hhxo"
3244
+ #
3245
+ # Related: String#squeeze.
3070
3246
  #
3071
3247
  def tr_s: (string from_str, string to_str) -> String
3072
3248
 
3073
3249
  # <!--
3074
3250
  # rdoc-file=string.c
3075
- # - str.tr_s!(from_str, to_str) -> str or nil
3251
+ # - tr_s!(selector, replacements) -> self or nil
3076
3252
  # -->
3077
- # Performs String#tr_s processing on *str* in place, returning *str*, or `nil`
3078
- # if no changes were made.
3253
+ # Like String#tr_s, but modifies `self` in place. Returns `self` if any changes
3254
+ # were made, `nil` otherwise.
3255
+ #
3256
+ # Related: String#squeeze!.
3079
3257
  #
3080
3258
  def tr_s!: (string from_str, string to_str) -> String?
3081
3259
 
@@ -3096,209 +3274,91 @@ class String
3096
3274
 
3097
3275
  # <!--
3098
3276
  # rdoc-file=string.c
3099
- # - str.unicode_normalize(form=:nfc)
3277
+ # - unicode_normalize(form = :nfc) -> string
3100
3278
  # -->
3101
- # Unicode Normalization---Returns a normalized form of `str`, using Unicode
3102
- # normalizations NFC, NFD, NFKC, or NFKD. The normalization form used is
3103
- # determined by `form`, which can be any of the four values `:nfc`, `:nfd`,
3104
- # `:nfkc`, or `:nfkd`. The default is `:nfc`.
3279
+ # Returns a copy of `self` with [Unicode
3280
+ # normalization](https://unicode.org/reports/tr15) applied.
3281
+ #
3282
+ # Argument `form` must be one of the following symbols (see [Unicode
3283
+ # normalization forms](https://unicode.org/reports/tr15/#Norm_Forms)):
3105
3284
  #
3106
- # If the string is not in a Unicode Encoding, then an Exception is raised. In
3107
- # this context, 'Unicode Encoding' means any of UTF-8, UTF-16BE/LE, and
3108
- # UTF-32BE/LE, as well as GB18030, UCS_2BE, and UCS_4BE. Anything other than
3109
- # UTF-8 is implemented by converting to UTF-8, which makes it slower than UTF-8.
3285
+ # * `:nfc`: Canonical decomposition, followed by canonical composition.
3286
+ # * `:nfd`: Canonical decomposition.
3287
+ # * `:nfkc`: Compatibility decomposition, followed by canonical composition.
3288
+ # * `:nfkd`: Compatibility decomposition.
3289
+ #
3290
+ #
3291
+ # The encoding of `self` must be one of:
3292
+ #
3293
+ # * Encoding::UTF_8
3294
+ # * Encoding::UTF_16BE
3295
+ # * Encoding::UTF_16LE
3296
+ # * Encoding::UTF_32BE
3297
+ # * Encoding::UTF_32LE
3298
+ # * Encoding::GB18030
3299
+ # * Encoding::UCS_2BE
3300
+ # * Encoding::UCS_4BE
3301
+ #
3302
+ #
3303
+ # Examples:
3110
3304
  #
3111
- # "a\u0300".unicode_normalize #=> "\u00E0"
3112
- # "a\u0300".unicode_normalize(:nfc) #=> "\u00E0"
3113
- # "\u00E0".unicode_normalize(:nfd) #=> "a\u0300"
3114
- # "\xE0".force_encoding('ISO-8859-1').unicode_normalize(:nfd)
3115
- # #=> Encoding::CompatibilityError raised
3305
+ # "a\u0300".unicode_normalize # => "a"
3306
+ # "\u00E0".unicode_normalize(:nfd) # => "a "
3307
+ #
3308
+ # Related: String#unicode_normalize!, String#unicode_normalized?.
3116
3309
  #
3117
3310
  def unicode_normalize: (?:nfc | :nfd | :nfkc | :nfkd) -> String
3118
3311
 
3119
3312
  # <!--
3120
3313
  # rdoc-file=string.c
3121
- # - str.unicode_normalize!(form=:nfc)
3314
+ # - unicode_normalize!(form = :nfc) -> self
3122
3315
  # -->
3123
- # Destructive version of String#unicode_normalize, doing Unicode normalization
3124
- # in place.
3316
+ # Like String#unicode_normalize, except that the normalization is performed on
3317
+ # `self`.
3318
+ #
3319
+ # Related String#unicode_normalized?.
3125
3320
  #
3126
3321
  def unicode_normalize!: (?:nfc | :nfd | :nfkc | :nfkd) -> String
3127
3322
 
3128
3323
  # <!--
3129
3324
  # rdoc-file=string.c
3130
- # - str.unicode_normalized?(form=:nfc)
3325
+ # - unicode_normalized?(form = :nfc) -> true or false
3131
3326
  # -->
3132
- # Checks whether `str` is in Unicode normalization form `form`, which can be any
3133
- # of the four values `:nfc`, `:nfd`, `:nfkc`, or `:nfkd`. The default is `:nfc`.
3327
+ # Returns `true` if `self` is in the given `form` of Unicode normalization,
3328
+ # `false` otherwise. The `form` must be one of `:nfc`, `:nfd`, `:nfkc`, or
3329
+ # `:nfkd`.
3330
+ #
3331
+ # Examples:
3134
3332
  #
3135
- # If the string is not in a Unicode Encoding, then an Exception is raised. For
3136
- # details, see String#unicode_normalize.
3333
+ # "a\u0300".unicode_normalized? # => false
3334
+ # "a\u0300".unicode_normalized?(:nfd) # => true
3335
+ # "\u00E0".unicode_normalized? # => true
3336
+ # "\u00E0".unicode_normalized?(:nfd) # => false
3137
3337
  #
3138
- # "a\u0300".unicode_normalized? #=> false
3139
- # "a\u0300".unicode_normalized?(:nfd) #=> true
3140
- # "\u00E0".unicode_normalized? #=> true
3141
- # "\u00E0".unicode_normalized?(:nfd) #=> false
3142
- # "\xE0".force_encoding('ISO-8859-1').unicode_normalized?
3143
- # #=> Encoding::CompatibilityError raised
3338
+ # Raises an exception if `self` is not in a Unicode encoding:
3339
+ #
3340
+ # s = "\xE0".force_encoding('ISO-8859-1')
3341
+ # s.unicode_normalized? # Raises Encoding::CompatibilityError.
3342
+ #
3343
+ # Related: String#unicode_normalize, String#unicode_normalize!.
3144
3344
  #
3145
3345
  def unicode_normalized?: (?:nfc | :nfd | :nfkc | :nfkd) -> bool
3146
3346
 
3147
3347
  # <!--
3148
3348
  # rdoc-file=pack.rb
3149
- # - str.unpack(format) -> anArray
3150
- # - str.unpack(format, offset: anInteger) -> anArray
3151
- # -->
3152
- # Decodes *str* (which may contain binary data) according to the format string,
3153
- # returning an array of each value extracted. The format string consists of a
3154
- # sequence of single-character directives, summarized in the table at the end of
3155
- # this entry. Each directive may be followed by a number, indicating the number
3156
- # of times to repeat with this directive. An asterisk (```*`'') will use up all
3157
- # remaining elements. The directives `sSiIlL` may each be followed by an
3158
- # underscore (```_`'') or exclamation mark (```!`'') to use the underlying
3159
- # platform's native size for the specified type; otherwise, it uses a
3160
- # platform-independent consistent size. Spaces are ignored in the format string.
3161
- #
3162
- # See also String#unpack1, Array#pack.
3163
- #
3164
- # "abc \0\0abc \0\0".unpack('A6Z6') #=> ["abc", "abc "]
3165
- # "abc \0\0".unpack('a3a3') #=> ["abc", " \000\000"]
3166
- # "abc \0abc \0".unpack('Z*Z*') #=> ["abc ", "abc "]
3167
- # "aa".unpack('b8B8') #=> ["10000110", "01100001"]
3168
- # "aaa".unpack('h2H2c') #=> ["16", "61", 97]
3169
- # "\xfe\xff\xfe\xff".unpack('sS') #=> [-2, 65534]
3170
- # "now=20is".unpack('M*') #=> ["now is"]
3171
- # "whole".unpack('xax2aX2aX1aX2a') #=> ["h", "e", "l", "l", "o"]
3172
- #
3173
- # This table summarizes the various formats and the Ruby classes returned by
3174
- # each.
3175
- #
3176
- # Integer | |
3177
- # Directive | Returns | Meaning
3178
- # ------------------------------------------------------------------
3179
- # C | Integer | 8-bit unsigned (unsigned char)
3180
- # S | Integer | 16-bit unsigned, native endian (uint16_t)
3181
- # L | Integer | 32-bit unsigned, native endian (uint32_t)
3182
- # Q | Integer | 64-bit unsigned, native endian (uint64_t)
3183
- # J | Integer | pointer width unsigned, native endian (uintptr_t)
3184
- # | |
3185
- # c | Integer | 8-bit signed (signed char)
3186
- # s | Integer | 16-bit signed, native endian (int16_t)
3187
- # l | Integer | 32-bit signed, native endian (int32_t)
3188
- # q | Integer | 64-bit signed, native endian (int64_t)
3189
- # j | Integer | pointer width signed, native endian (intptr_t)
3190
- # | |
3191
- # S_ S! | Integer | unsigned short, native endian
3192
- # I I_ I! | Integer | unsigned int, native endian
3193
- # L_ L! | Integer | unsigned long, native endian
3194
- # Q_ Q! | Integer | unsigned long long, native endian (ArgumentError
3195
- # | | if the platform has no long long type.)
3196
- # J! | Integer | uintptr_t, native endian (same with J)
3197
- # | |
3198
- # s_ s! | Integer | signed short, native endian
3199
- # i i_ i! | Integer | signed int, native endian
3200
- # l_ l! | Integer | signed long, native endian
3201
- # q_ q! | Integer | signed long long, native endian (ArgumentError
3202
- # | | if the platform has no long long type.)
3203
- # j! | Integer | intptr_t, native endian (same with j)
3204
- # | |
3205
- # S> s> S!> s!> | Integer | same as the directives without ">" except
3206
- # L> l> L!> l!> | | big endian
3207
- # I!> i!> | |
3208
- # Q> q> Q!> q!> | | "S>" is the same as "n"
3209
- # J> j> J!> j!> | | "L>" is the same as "N"
3210
- # | |
3211
- # S< s< S!< s!< | Integer | same as the directives without "<" except
3212
- # L< l< L!< l!< | | little endian
3213
- # I!< i!< | |
3214
- # Q< q< Q!< q!< | | "S<" is the same as "v"
3215
- # J< j< J!< j!< | | "L<" is the same as "V"
3216
- # | |
3217
- # n | Integer | 16-bit unsigned, network (big-endian) byte order
3218
- # N | Integer | 32-bit unsigned, network (big-endian) byte order
3219
- # v | Integer | 16-bit unsigned, VAX (little-endian) byte order
3220
- # V | Integer | 32-bit unsigned, VAX (little-endian) byte order
3221
- # | |
3222
- # U | Integer | UTF-8 character
3223
- # w | Integer | BER-compressed integer (see Array#pack)
3224
- #
3225
- # Float | |
3226
- # Directive | Returns | Meaning
3227
- # -----------------------------------------------------------------
3228
- # D d | Float | double-precision, native format
3229
- # F f | Float | single-precision, native format
3230
- # E | Float | double-precision, little-endian byte order
3231
- # e | Float | single-precision, little-endian byte order
3232
- # G | Float | double-precision, network (big-endian) byte order
3233
- # g | Float | single-precision, network (big-endian) byte order
3234
- #
3235
- # String | |
3236
- # Directive | Returns | Meaning
3237
- # -----------------------------------------------------------------
3238
- # A | String | arbitrary binary string (remove trailing nulls and ASCII spaces)
3239
- # a | String | arbitrary binary string
3240
- # Z | String | null-terminated string
3241
- # B | String | bit string (MSB first)
3242
- # b | String | bit string (LSB first)
3243
- # H | String | hex string (high nibble first)
3244
- # h | String | hex string (low nibble first)
3245
- # u | String | UU-encoded string
3246
- # M | String | quoted-printable, MIME encoding (see RFC2045)
3247
- # m | String | base64 encoded string (RFC 2045) (default)
3248
- # | | base64 encoded string (RFC 4648) if followed by 0
3249
- # P | String | pointer to a structure (fixed-length string)
3250
- # p | String | pointer to a null-terminated string
3251
- #
3252
- # Misc. | |
3253
- # Directive | Returns | Meaning
3254
- # -----------------------------------------------------------------
3255
- # @ | --- | skip to the offset given by the length argument
3256
- # X | --- | skip backward one byte
3257
- # x | --- | skip forward one byte
3258
- #
3259
- # The keyword *offset* can be given to start the decoding after skipping the
3260
- # specified amount of bytes:
3261
- # "abc".unpack("C*") # => [97, 98, 99]
3262
- # "abc".unpack("C*", offset: 2) # => [99]
3263
- # "abc".unpack("C*", offset: 4) # => offset outside of string (ArgumentError)
3264
- #
3265
- # HISTORY
3266
- #
3267
- # * J, J! j, and j! are available since Ruby 2.3.
3268
- # * Q_, Q!, q_, and q! are available since Ruby 2.1.
3269
- # * I!<, i!<, I!>, and i!> are available since Ruby 1.9.3.
3349
+ # - unpack(template, offset: 0) -> array
3350
+ # -->
3351
+ # Extracts data from `self`, forming objects that become the elements of a new
3352
+ # array; returns that array. See [Packed Data](rdoc-ref:packed_data.rdoc).
3270
3353
  #
3271
3354
  def unpack: (String format, ?offset: Integer) -> Array[Integer | Float | String | nil]
3272
3355
 
3273
3356
  # <!--
3274
3357
  # rdoc-file=pack.rb
3275
- # - str.unpack1(format) -> obj
3276
- # - str.unpack1(format, offset: anInteger) -> obj
3358
+ # - unpack1(template, offset: 0) -> object
3277
3359
  # -->
3278
- # Decodes *str* (which may contain binary data) according to the format string,
3279
- # returning the first value extracted.
3280
- #
3281
- # See also String#unpack, Array#pack.
3282
- #
3283
- # Contrast with String#unpack:
3284
- #
3285
- # "abc \0\0abc \0\0".unpack('A6Z6') #=> ["abc", "abc "]
3286
- # "abc \0\0abc \0\0".unpack1('A6Z6') #=> "abc"
3287
- #
3288
- # In that case data would be lost but often it's the case that the array only
3289
- # holds one value, especially when unpacking binary data. For instance:
3290
- #
3291
- # "\xff\x00\x00\x00".unpack("l") #=> [255]
3292
- # "\xff\x00\x00\x00".unpack1("l") #=> 255
3293
- #
3294
- # Thus unpack1 is convenient, makes clear the intention and signals the expected
3295
- # return value to those reading the code.
3296
- #
3297
- # The keyword *offset* can be given to start the decoding after skipping the
3298
- # specified amount of bytes:
3299
- # "abc".unpack1("C*") # => 97
3300
- # "abc".unpack1("C*", offset: 2) # => 99
3301
- # "abc".unpack1("C*", offset: 4) # => offset outside of string (ArgumentError)
3360
+ # Like String#unpack, but unpacks and returns only the first extracted object.
3361
+ # See [Packed Data](rdoc-ref:packed_data.rdoc).
3302
3362
  #
3303
3363
  def unpack1: (String format) -> (Integer | Float | String | nil)
3304
3364
 
@@ -3312,7 +3372,7 @@ class String
3312
3372
  # s.upcase # => "HELLO WORLD!"
3313
3373
  #
3314
3374
  # The casing may be affected by the given `options`; see [Case
3315
- # Mapping](doc/case_mapping_rdoc.html).
3375
+ # Mapping](rdoc-ref:case_mapping.rdoc).
3316
3376
  #
3317
3377
  # Related: String#upcase!, String#downcase, String#downcase!.
3318
3378
  #
@@ -3334,7 +3394,7 @@ class String
3334
3394
  # s.upcase! # => nil
3335
3395
  #
3336
3396
  # The casing may be affected by the given `options`; see [Case
3337
- # Mapping](doc/case_mapping_rdoc.html).
3397
+ # Mapping](rdoc-ref:case_mapping.rdoc).
3338
3398
  #
3339
3399
  # Related: String#upcase, String#downcase, String#downcase!.
3340
3400
  #
@@ -3382,13 +3442,13 @@ class String
3382
3442
 
3383
3443
  # <!--
3384
3444
  # rdoc-file=string.c
3385
- # - str.valid_encoding? -> true or false
3445
+ # - valid_encoding? -> true or false
3386
3446
  # -->
3387
- # Returns true for a string which is encoded correctly.
3447
+ # Returns `true` if `self` is encoded correctly, `false` otherwise:
3388
3448
  #
3389
- # "\xc2\xa1".force_encoding("UTF-8").valid_encoding? #=> true
3390
- # "\xc2".force_encoding("UTF-8").valid_encoding? #=> false
3391
- # "\x80".force_encoding("UTF-8").valid_encoding? #=> false
3449
+ # "\xc2\xa1".force_encoding("UTF-8").valid_encoding? # => true
3450
+ # "\xc2".force_encoding("UTF-8").valid_encoding? # => false
3451
+ # "\x80".force_encoding("UTF-8").valid_encoding? # => false
3392
3452
  #
3393
3453
  def valid_encoding?: () -> bool
3394
3454
 
@@ -3396,42 +3456,53 @@ class String
3396
3456
 
3397
3457
  # <!--
3398
3458
  # rdoc-file=string.c
3399
- # - String.new(string = '') -> new_string
3400
- # - String.new(string = '', encoding: encoding) -> new_string
3401
- # - String.new(string = '', capacity: size) -> new_string
3459
+ # - String.new(string = '', **opts) -> new_string
3402
3460
  # -->
3403
3461
  # Returns a new String that is a copy of `string`.
3404
3462
  #
3405
3463
  # With no arguments, returns the empty string with the Encoding `ASCII-8BIT`:
3464
+ #
3406
3465
  # s = String.new
3407
3466
  # s # => ""
3408
3467
  # s.encoding # => #<Encoding:ASCII-8BIT>
3409
3468
  #
3410
- # With the single String argument `string`, returns a copy of `string` with the
3411
- # same encoding as `string`:
3412
- # s = String.new("Que veut dire \u{e7}a?")
3413
- # s # => "Que veut dire \u{e7}a?"
3414
- # s.encoding # => #<Encoding:UTF-8>
3415
- #
3416
- # Literal strings like `""` or here-documents always use [script
3417
- # encoding](Encoding.html#class-Encoding-label-Script+encoding), unlike
3418
- # String.new.
3419
- #
3420
- # With keyword `encoding`, returns a copy of `str` with the specified encoding:
3421
- # s = String.new(encoding: 'ASCII')
3422
- # s.encoding # => #<Encoding:US-ASCII>
3423
- # s = String.new('foo', encoding: 'ASCII')
3424
- # s.encoding # => #<Encoding:US-ASCII>
3425
- #
3426
- # Note that these are equivalent:
3427
- # s0 = String.new('foo', encoding: 'ASCII')
3428
- # s1 = 'foo'.force_encoding('ASCII')
3429
- # s0.encoding == s1.encoding # => true
3430
- #
3431
- # With keyword `capacity`, returns a copy of `str`; the given `capacity` may set
3432
- # the size of the internal buffer, which may affect performance:
3433
- # String.new(capacity: 1) # => ""
3434
- # String.new(capacity: 4096) # => ""
3469
+ # With optional argument `string` and no keyword arguments, returns a copy of
3470
+ # `string` with the same encoding:
3471
+ #
3472
+ # String.new('foo') # => "foo"
3473
+ # String.new('тест') # => "тест"
3474
+ # String.new('こんにちは') # => "こんにちは"
3475
+ #
3476
+ # (Unlike String.new, a [string
3477
+ # literal](rdoc-ref:syntax/literals.rdoc@String+Literals) like `''` or a [here
3478
+ # document literal](rdoc-ref:syntax/literals.rdoc@Here+Document+Literals) always
3479
+ # has [script encoding](rdoc-ref:encodings.rdoc@Script+Encoding).)
3480
+ #
3481
+ # With optional keyword argument `encoding`, returns a copy of `string` with the
3482
+ # specified encoding; the `encoding` may be an Encoding object, an encoding
3483
+ # name, or an encoding name alias:
3484
+ #
3485
+ # String.new('foo', encoding: Encoding::US_ASCII).encoding # => #<Encoding:US-ASCII>
3486
+ # String.new('foo', encoding: 'US-ASCII').encoding # => #<Encoding:US-ASCII>
3487
+ # String.new('foo', encoding: 'ASCII').encoding # => #<Encoding:US-ASCII>
3488
+ #
3489
+ # The given encoding need not be valid for the string's content, and that
3490
+ # validity is not checked:
3491
+ #
3492
+ # s = String.new('こんにちは', encoding: 'ascii')
3493
+ # s.valid_encoding? # => false
3494
+ #
3495
+ # But the given `encoding` itself is checked:
3496
+ #
3497
+ # String.new('foo', encoding: 'bar') # Raises ArgumentError.
3498
+ #
3499
+ # With optional keyword argument `capacity`, returns a copy of `string` (or an
3500
+ # empty string, if `string` is not given); the given `capacity` is advisory
3501
+ # only, and may or may not set the size of the internal buffer, which may in
3502
+ # turn affect performance:
3503
+ #
3504
+ # String.new(capacity: 1)
3505
+ # String.new('foo', capacity: 4096)
3435
3506
  #
3436
3507
  # The `string`, `encoding`, and `capacity` arguments may all be used together:
3437
3508
  #