rbs 3.7.0.pre.1 → 3.8.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +3 -3
  3. data/.github/workflows/ruby.yml +7 -7
  4. data/CHANGELOG.md +58 -0
  5. data/core/array.rbs +1743 -1580
  6. data/core/basic_object.rbs +38 -35
  7. data/core/comparable.rbs +1 -1
  8. data/core/complex.rbs +165 -93
  9. data/core/data.rbs +1 -1
  10. data/core/dir.rbs +1 -17
  11. data/core/encoding.rbs +12 -6
  12. data/core/enumerable.rbs +270 -266
  13. data/core/enumerator.rbs +0 -2
  14. data/core/env.rbs +1 -1
  15. data/core/errno.rbs +33 -16
  16. data/core/errors.rbs +2 -2
  17. data/core/exception.rbs +236 -170
  18. data/core/fiber.rbs +3 -2
  19. data/core/file.rbs +32 -74
  20. data/core/float.rbs +125 -72
  21. data/core/gc.rbs +138 -40
  22. data/core/hash.rbs +120 -141
  23. data/core/integer.rbs +79 -50
  24. data/core/io/buffer.rbs +49 -43
  25. data/core/io.rbs +97 -144
  26. data/core/kernel.rbs +290 -200
  27. data/core/match_data.rbs +76 -2
  28. data/core/math.rbs +0 -36
  29. data/core/module.rbs +28 -23
  30. data/core/nil_class.rbs +0 -3
  31. data/core/numeric.rbs +100 -103
  32. data/core/object.rbs +0 -4
  33. data/core/object_space/weak_key_map.rbs +3 -4
  34. data/core/object_space.rbs +3 -3
  35. data/core/proc.rbs +0 -2
  36. data/core/process.rbs +109 -57
  37. data/core/ractor.rbs +37 -4
  38. data/core/range.rbs +114 -87
  39. data/core/rational.rbs +0 -2
  40. data/core/rbs/unnamed/argf.rbs +234 -33
  41. data/core/rbs/unnamed/env_class.rbs +35 -53
  42. data/core/rbs/unnamed/random.rbs +1 -2
  43. data/core/regexp.rbs +4 -52
  44. data/core/ruby_vm.rbs +88 -9
  45. data/core/rubygems/config_file.rbs +3 -0
  46. data/core/rubygems/errors.rbs +0 -5
  47. data/core/rubygems/platform.rbs +0 -9
  48. data/core/rubygems/rubygems.rbs +0 -5
  49. data/core/rubygems/version.rbs +6 -6
  50. data/core/set.rbs +3 -15
  51. data/core/string.rbs +130 -136
  52. data/core/struct.rbs +6 -18
  53. data/core/symbol.rbs +14 -21
  54. data/core/thread.rbs +32 -35
  55. data/core/time.rbs +127 -50
  56. data/core/trace_point.rbs +16 -0
  57. data/core/true_class.rbs +0 -1
  58. data/core/warning.rbs +9 -2
  59. data/docs/architecture.md +1 -1
  60. data/docs/syntax.md +1 -1
  61. data/ext/rbs_extension/location.c +29 -19
  62. data/ext/rbs_extension/parser.c +267 -292
  63. data/ext/rbs_extension/parserstate.c +56 -22
  64. data/lib/rbs/annotate/annotations.rb +3 -3
  65. data/lib/rbs/annotate/rdoc_source.rb +2 -2
  66. data/lib/rbs/cli/diff.rb +3 -3
  67. data/lib/rbs/cli/validate.rb +1 -1
  68. data/lib/rbs/cli.rb +13 -13
  69. data/lib/rbs/collection/config.rb +3 -1
  70. data/lib/rbs/definition_builder/ancestor_builder.rb +3 -3
  71. data/lib/rbs/environment_loader.rb +1 -1
  72. data/lib/rbs/namespace.rb +1 -0
  73. data/lib/rbs/parser_aux.rb +2 -2
  74. data/lib/rbs/prototype/rb.rb +11 -8
  75. data/lib/rbs/prototype/rbi.rb +9 -5
  76. data/lib/rbs/prototype/runtime/value_object_generator.rb +7 -5
  77. data/lib/rbs/prototype/runtime.rb +4 -5
  78. data/lib/rbs/type_name.rb +14 -9
  79. data/lib/rbs/unit_test/type_assertions.rb +2 -2
  80. data/lib/rbs/validator.rb +3 -1
  81. data/lib/rbs/version.rb +1 -1
  82. data/lib/rdoc_plugin/parser.rb +2 -2
  83. data/rbs.gemspec +4 -0
  84. data/sig/ancestor_graph.rbs +4 -4
  85. data/sig/namespace.rbs +2 -3
  86. data/sig/resolver/constant_resolver.rbs +2 -2
  87. data/sig/resolver/context.rbs +1 -1
  88. data/sig/type_alias_regularity.rbs +5 -5
  89. data/sig/typename.rbs +8 -5
  90. data/sig/use_map.rbs +1 -1
  91. data/sig/validator.rbs +2 -2
  92. data/stdlib/base64/0/base64.rbs +0 -9
  93. data/stdlib/benchmark/0/benchmark.rbs +11 -2
  94. data/stdlib/bigdecimal/0/big_decimal.rbs +26 -182
  95. data/stdlib/cgi/0/core.rbs +47 -0
  96. data/stdlib/coverage/0/coverage.rbs +0 -3
  97. data/stdlib/csv/0/csv.rbs +18 -58
  98. data/stdlib/date/0/date.rbs +4 -19
  99. data/stdlib/did_you_mean/0/did_you_mean.rbs +0 -5
  100. data/stdlib/digest/0/digest.rbs +25 -2
  101. data/stdlib/erb/0/erb.rbs +0 -1
  102. data/stdlib/etc/0/etc.rbs +51 -34
  103. data/stdlib/fileutils/0/fileutils.rbs +3 -44
  104. data/stdlib/io-console/0/io-console.rbs +69 -15
  105. data/stdlib/ipaddr/0/ipaddr.rbs +8 -4
  106. data/stdlib/json/0/json.rbs +56 -71
  107. data/stdlib/logger/0/log_device.rbs +1 -1
  108. data/stdlib/logger/0/logger.rbs +3 -18
  109. data/stdlib/net-http/0/net-http.rbs +19 -77
  110. data/stdlib/nkf/0/nkf.rbs +30 -0
  111. data/stdlib/objspace/0/objspace.rbs +1 -2
  112. data/stdlib/observable/0/observable.rbs +1 -1
  113. data/stdlib/open-uri/0/open-uri.rbs +52 -0
  114. data/stdlib/open3/0/open3.rbs +0 -8
  115. data/stdlib/openssl/0/openssl.rbs +136 -69
  116. data/stdlib/optparse/0/optparse.rbs +58 -18
  117. data/stdlib/pathname/0/pathname.rbs +2 -8
  118. data/stdlib/pp/0/pp.rbs +3 -1
  119. data/stdlib/prettyprint/0/prettyprint.rbs +0 -4
  120. data/stdlib/pstore/0/pstore.rbs +0 -6
  121. data/stdlib/psych/0/psych.rbs +15 -4
  122. data/stdlib/pty/0/pty.rbs +46 -4
  123. data/stdlib/rdoc/0/code_object.rbs +0 -4
  124. data/stdlib/rdoc/0/markup.rbs +10 -12
  125. data/stdlib/rdoc/0/rdoc.rbs +1 -2
  126. data/stdlib/resolv/0/resolv.rbs +8 -3
  127. data/stdlib/ripper/0/ripper.rbs +0 -2
  128. data/stdlib/securerandom/0/securerandom.rbs +0 -2
  129. data/stdlib/shellwords/0/shellwords.rbs +11 -12
  130. data/stdlib/singleton/0/singleton.rbs +0 -1
  131. data/stdlib/socket/0/addrinfo.rbs +0 -1
  132. data/stdlib/socket/0/basic_socket.rbs +0 -5
  133. data/stdlib/socket/0/socket.rbs +49 -25
  134. data/stdlib/socket/0/tcp_server.rbs +0 -3
  135. data/stdlib/socket/0/tcp_socket.rbs +58 -3
  136. data/stdlib/socket/0/udp_socket.rbs +0 -1
  137. data/stdlib/socket/0/unix_server.rbs +0 -3
  138. data/stdlib/strscan/0/string_scanner.rbs +1265 -422
  139. data/stdlib/tempfile/0/tempfile.rbs +135 -28
  140. data/stdlib/time/0/time.rbs +48 -35
  141. data/stdlib/timeout/0/timeout.rbs +11 -8
  142. data/stdlib/tmpdir/0/tmpdir.rbs +8 -1
  143. data/stdlib/tsort/0/tsort.rbs +0 -4
  144. data/stdlib/uri/0/common.rbs +11 -30
  145. data/stdlib/uri/0/ftp.rbs +1 -1
  146. data/stdlib/uri/0/generic.rbs +22 -18
  147. data/stdlib/uri/0/http.rbs +2 -2
  148. data/stdlib/uri/0/rfc2396_parser.rbs +3 -0
  149. data/stdlib/zlib/0/buf_error.rbs +1 -70
  150. data/stdlib/zlib/0/data_error.rbs +1 -70
  151. data/stdlib/zlib/0/deflate.rbs +8 -72
  152. data/stdlib/zlib/0/error.rbs +1 -70
  153. data/stdlib/zlib/0/gzip_file/crc_error.rbs +2 -105
  154. data/stdlib/zlib/0/gzip_file/error.rbs +2 -105
  155. data/stdlib/zlib/0/gzip_file/length_error.rbs +2 -105
  156. data/stdlib/zlib/0/gzip_file/no_footer.rbs +2 -105
  157. data/stdlib/zlib/0/gzip_file.rbs +1 -71
  158. data/stdlib/zlib/0/gzip_reader.rbs +3 -74
  159. data/stdlib/zlib/0/gzip_writer.rbs +1 -70
  160. data/stdlib/zlib/0/inflate.rbs +4 -71
  161. data/stdlib/zlib/0/mem_error.rbs +1 -70
  162. data/stdlib/zlib/0/need_dict.rbs +1 -70
  163. data/stdlib/zlib/0/stream_end.rbs +1 -70
  164. data/stdlib/zlib/0/stream_error.rbs +1 -70
  165. data/stdlib/zlib/0/version_error.rbs +1 -70
  166. data/stdlib/zlib/0/zlib.rbs +0 -2
  167. data/stdlib/zlib/0/zstream.rbs +4 -72
  168. metadata +4 -6
data/core/range.rbs CHANGED
@@ -13,15 +13,13 @@
13
13
  # (1...4).to_a # => [1, 2, 3]
14
14
  # ('a'...'d').to_a # => ["a", "b", "c"]
15
15
  #
16
+ # * Method Range.new:
16
17
  #
17
- # A range may be created using method Range.new:
18
- #
19
- # # Ranges that by default include the given end value.
20
- # Range.new(1, 4).to_a # => [1, 2, 3, 4]
21
- # Range.new('a', 'd').to_a # => ["a", "b", "c", "d"]
22
- # # Ranges that use third argument +exclude_end+ to exclude the given end value.
23
- # Range.new(1, 4, true).to_a # => [1, 2, 3]
24
- # Range.new('a', 'd', true).to_a # => ["a", "b", "c"]
18
+ # # Ranges that by default include the given end value. Range.new(1, 4).to_a
19
+ # # => [1, 2, 3, 4] Range.new('a', 'd').to_a # => ["a", "b", "c", "d"] #
20
+ # Ranges that use third argument `exclude_end` to exclude the given end
21
+ # value. Range.new(1, 4, true).to_a # => [1, 2, 3] Range.new('a', 'd',
22
+ # true).to_a # => ["a", "b", "c"]
25
23
  #
26
24
  # ## Beginless Ranges
27
25
  #
@@ -42,8 +40,12 @@
42
40
  # A beginless range may be used to slice an array:
43
41
  #
44
42
  # a = [1, 2, 3, 4]
45
- # r = (..2) # => nil...2
46
- # a[r] # => [1, 2]
43
+ # # Include the third array element in the slice
44
+ # r = (..2) # => nil..2
45
+ # a[r] # => [1, 2, 3]
46
+ # # Exclude the third array element from the slice
47
+ # r = (...2) # => nil...2
48
+ # a[r] # => [1, 2]
47
49
  #
48
50
  # Method `each` for a beginless range raises an exception.
49
51
  #
@@ -96,8 +98,8 @@
96
98
  # ## Ranges and Other Classes
97
99
  #
98
100
  # An object may be put into a range if its class implements instance method
99
- # `<=>`. Ruby core classes that do so include Array, Complex, File::Stat, Float,
100
- # Integer, Kernel, Module, Numeric, Rational, String, Symbol, and Time.
101
+ # `#<=>`. Ruby core classes that do so include Array, Complex, File::Stat,
102
+ # Float, Integer, Kernel, Module, Numeric, Rational, String, Symbol, and Time.
101
103
  #
102
104
  # Example:
103
105
  #
@@ -117,7 +119,6 @@
117
119
  # * Included from module Enumerable: #each_entry, #each_with_index,
118
120
  # #each_with_object, #each_slice, #each_cons, and #reverse_each.
119
121
  #
120
- #
121
122
  # Example:
122
123
  #
123
124
  # a = []
@@ -127,12 +128,12 @@
127
128
  # ## Ranges and User-Defined Classes
128
129
  #
129
130
  # A user-defined class that is to be used in a range must implement instance
130
- # `<=>`; see Integer#<=>. To make iteration available, it must also implement
131
- # instance method `succ`; see Integer#succ.
131
+ # method `#<=>`; see Integer#<=>. To make iteration available, it must also
132
+ # implement instance method `succ`; see Integer#succ.
132
133
  #
133
- # The class below implements both `<=>` and `succ`, and so can be used both to
134
+ # The class below implements both `#<=>` and `succ`, and so can be used both to
134
135
  # construct ranges and to iterate over them. Note that the Comparable module is
135
- # included so the `==` method is defined in terms of `<=>`.
136
+ # included so the `==` method is defined in terms of `#<=>`.
136
137
  #
137
138
  # # Represent a string of 'X' characters.
138
139
  # class Xs
@@ -168,7 +169,6 @@
168
169
  # * Includes [module Enumerable](rdoc-ref:Enumerable@What-27s+Here), which
169
170
  # provides dozens of additional methods.
170
171
  #
171
- #
172
172
  # Here, class Range provides methods that are useful for:
173
173
  #
174
174
  # * [Creating a Range](rdoc-ref:Range@Methods+for+Creating+a+Range)
@@ -179,12 +179,10 @@
179
179
  # * [Methods for Working with
180
180
  # JSON](rdoc-ref:Range@Methods+for+Working+with+JSON)
181
181
  #
182
- #
183
182
  # ### Methods for Creating a Range
184
183
  #
185
184
  # * ::new: Returns a new range.
186
185
  #
187
- #
188
186
  # ### Methods for Querying
189
187
  #
190
188
  # * #begin: Returns the begin value given for `self`.
@@ -200,7 +198,6 @@
200
198
  # * #minmax: Returns the minimum and maximum values in `self`.
201
199
  # * #size: Returns the count of elements in `self`.
202
200
  #
203
- #
204
201
  # ### Methods for Comparing
205
202
  #
206
203
  # * #==: Returns whether a given object is equal to `self` (uses #==).
@@ -211,7 +208,6 @@
211
208
  # * #include? (aliased as #member?): Returns whether a given object is an
212
209
  # element of `self`.
213
210
  #
214
- #
215
211
  # ### Methods for Iterating
216
212
  #
217
213
  # * #%: Requires argument `n`; calls the block with each `n`-th element of
@@ -220,14 +216,12 @@
220
216
  # * #step: Takes optional argument `n` (defaults to 1); calls the block with
221
217
  # each `n`-th element of `self`.
222
218
  #
223
- #
224
219
  # ### Methods for Converting
225
220
  #
226
221
  # * #inspect: Returns a string representation of `self` (uses #inspect).
227
222
  # * #to_a (aliased as #entries): Returns elements of `self` in an array.
228
223
  # * #to_s: Returns a string representation of `self` (uses #to_s).
229
224
  #
230
- #
231
225
  # ### Methods for Working with JSON
232
226
  #
233
227
  # * ::json_create: Returns a new Range object constructed from the given
@@ -235,7 +229,6 @@
235
229
  # * #as_json: Returns a 2-element hash representing `self`.
236
230
  # * #to_json: Returns a JSON string representing `self`.
237
231
  #
238
- #
239
232
  # To make these methods available:
240
233
  #
241
234
  # require 'json/add/range'
@@ -246,29 +239,24 @@ class Range[out Elem] < Object
246
239
  # <!--
247
240
  # rdoc-file=range.c
248
241
  # - %(n) {|element| ... } -> self
249
- # - %(n) -> enumerator
242
+ # - %(n) -> enumerator or arithmetic_sequence
250
243
  # -->
251
- # Iterates over the elements of `self`.
244
+ # Same as #step (but doesn't provide default value for `n`). The method is
245
+ # convenient for experssive producing of Enumerator::ArithmeticSequence.
252
246
  #
253
- # With a block given, calls the block with selected elements of the range;
254
- # returns `self`:
247
+ # array = [0, 1, 2, 3, 4, 5, 6]
255
248
  #
256
- # a = []
257
- # (1..5).%(2) {|element| a.push(element) } # => 1..5
258
- # a # => [1, 3, 5]
259
- # a = []
260
- # ('a'..'e').%(2) {|element| a.push(element) } # => "a".."e"
261
- # a # => ["a", "c", "e"]
262
- #
263
- # With no block given, returns an enumerator, which will be of class
264
- # Enumerator::ArithmeticSequence if `self` is numeric; otherwise of class
265
- # Enumerator:
249
+ # # slice each second element:
250
+ # seq = (0..) % 2 #=> ((0..).%(2))
251
+ # array[seq] #=> [0, 2, 4, 6]
252
+ # # or just
253
+ # array[(0..) % 2] #=> [0, 2, 4, 6]
266
254
  #
267
- # e = (1..5) % 2 # => ((1..5).%(2))
268
- # e.class # => Enumerator::ArithmeticSequence
269
- # ('a'..'e') % 2 # => #<Enumerator: ...>
255
+ # Note that due to operator precedence in Ruby, parentheses are mandatory around
256
+ # range in this case:
270
257
  #
271
- # Related: Range#step.
258
+ # (0..7) % 2 #=> ((0..7).%(2)) -- as expected
259
+ # 0..7 % 2 #=> 0..1 -- parsed as 0..(7 % 2)
272
260
  #
273
261
  def %: (Numeric | int n) -> Enumerator[Elem, self]
274
262
  | (Numeric | int n) { (Elem element) -> void } -> self
@@ -284,7 +272,6 @@ class Range[out Elem] < Object
284
272
  # * `other.end == self.end`.
285
273
  # * `other.exclude_end? == self.exclude_end?`.
286
274
  #
287
- #
288
275
  # Otherwise returns `false`.
289
276
  #
290
277
  # r = (1..5)
@@ -447,10 +434,9 @@ class Range[out Elem] < Object
447
434
  # Returns `false` if either:
448
435
  #
449
436
  # * The begin value of `self` is larger than its end value.
450
- # * An internal call to `<=>` returns `nil`; that is, the operands are not
437
+ # * An internal call to `#<=>` returns `nil`; that is, the operands are not
451
438
  # comparable.
452
439
  #
453
- #
454
440
  # Beginless ranges cover all values of the same type before the end, excluding
455
441
  # the end for exclusive ranges. Beginless ranges cover ranges that end before
456
442
  # the end of the beginless range, or at the end of the beginless range for
@@ -682,7 +668,7 @@ class Range[out Elem] < Object
682
668
  # - max {|a, b| ... } -> object
683
669
  # - max(n) {|a, b| ... } -> array
684
670
  # -->
685
- # Returns the maximum value in `self`, using method `<=>` or a given block for
671
+ # Returns the maximum value in `self`, using method `#<=>` or a given block for
686
672
  # comparison.
687
673
  #
688
674
  # With no argument and no block given, returns the maximum-valued element of
@@ -706,7 +692,6 @@ class Range[out Elem] < Object
706
692
  # * Then, sequentially, with the so-far maximum value and the next element of
707
693
  # `self`.
708
694
  #
709
- #
710
695
  # To illustrate:
711
696
  #
712
697
  # (1..4).max {|a, b| p [a, b]; a <=> b } # => 4
@@ -749,13 +734,11 @@ class Range[out Elem] < Object
749
734
  # (1...1).max {|a, b| -(a <=> b) } # => nil
750
735
  # (1...1).max(2) {|a, b| -(a <=> b) } # => []
751
736
  #
752
- #
753
737
  # Raises an exception if either:
754
738
  #
755
739
  # * `self` is a endless range: `(1..)`.
756
740
  # * A block is given and `self` is a beginless range.
757
741
  #
758
- #
759
742
  # Related: Range#min, Range#minmax.
760
743
  #
761
744
  def max: () -> Elem
@@ -770,7 +753,7 @@ class Range[out Elem] < Object
770
753
  # - min {|a, b| ... } -> object
771
754
  # - min(n) {|a, b| ... } -> array
772
755
  # -->
773
- # Returns the minimum value in `self`, using method `<=>` or a given block for
756
+ # Returns the minimum value in `self`, using method `#<=>` or a given block for
774
757
  # comparison.
775
758
  #
776
759
  # With no argument and no block given, returns the minimum-valued element of
@@ -794,7 +777,6 @@ class Range[out Elem] < Object
794
777
  # * Then, sequentially, with the so-far minimum value and the next element of
795
778
  # `self`.
796
779
  #
797
- #
798
780
  # To illustrate:
799
781
  #
800
782
  # (1..4).min {|a, b| p [a, b]; a <=> b } # => 1
@@ -837,13 +819,11 @@ class Range[out Elem] < Object
837
819
  # (1...1).min {|a, b| -(a <=> b) } # => nil
838
820
  # (1...1).min(2) {|a, b| -(a <=> b) } # => []
839
821
  #
840
- #
841
822
  # Raises an exception if either:
842
823
  #
843
824
  # * `self` is a beginless range: `(..4)`.
844
825
  # * A block is given and `self` is an endless range.
845
826
  #
846
- #
847
827
  # Related: Range#max, Range#minmax.
848
828
  #
849
829
  def min: () -> Elem
@@ -865,7 +845,7 @@ class Range[out Elem] < Object
865
845
  #
866
846
  # (1..3).overlap?(1) # TypeError
867
847
  #
868
- # Returns `false` if an internal call to `<=>` returns `nil`; that is, the
848
+ # Returns `false` if an internal call to `#<=>` returns `nil`; that is, the
869
849
  # operands are not comparable.
870
850
  #
871
851
  # (1..3).overlap?('a'..'d') # => false
@@ -947,7 +927,12 @@ class Range[out Elem] < Object
947
927
  # (1..4).size # => 4
948
928
  # (1...4).size # => 3
949
929
  # (1..).size # => Infinity
950
- # ('a'..'z').size #=> nil
930
+ # ('a'..'z').size # => nil
931
+ #
932
+ # If `self` is not iterable, raises an exception:
933
+ #
934
+ # (0.5..2.5).size # TypeError
935
+ # (..1).size # TypeError
951
936
  #
952
937
  # Related: Range#count.
953
938
  #
@@ -956,43 +941,86 @@ class Range[out Elem] < Object
956
941
 
957
942
  # <!--
958
943
  # rdoc-file=range.c
959
- # - step(n = 1) {|element| ... } -> self
960
- # - step(n = 1) -> enumerator
944
+ # - step(s = 1) {|element| ... } -> self
945
+ # - step(s = 1) -> enumerator/arithmetic_sequence
961
946
  # -->
962
- # Iterates over the elements of `self`.
947
+ # Iterates over the elements of range in steps of `s`. The iteration is
948
+ # performed by `+` operator:
963
949
  #
964
- # With a block given and no argument, calls the block each element of the range;
965
- # returns `self`:
950
+ # (0..6).step(2) { puts _1 } #=> 1..5
951
+ # # Prints: 0, 2, 4, 6
966
952
  #
967
- # a = []
968
- # (1..5).step {|element| a.push(element) } # => 1..5
969
- # a # => [1, 2, 3, 4, 5]
970
- # a = []
971
- # ('a'..'e').step {|element| a.push(element) } # => "a".."e"
972
- # a # => ["a", "b", "c", "d", "e"]
953
+ # # Iterate between two dates in step of 1 day (24 hours)
954
+ # (Time.utc(2022, 2, 24)..Time.utc(2022, 3, 1)).step(24*60*60) { puts _1 }
955
+ # # Prints:
956
+ # # 2022-02-24 00:00:00 UTC
957
+ # # 2022-02-25 00:00:00 UTC
958
+ # # 2022-02-26 00:00:00 UTC
959
+ # # 2022-02-27 00:00:00 UTC
960
+ # # 2022-02-28 00:00:00 UTC
961
+ # # 2022-03-01 00:00:00 UTC
973
962
  #
974
- # With a block given and a positive integer argument `n` given, calls the block
975
- # with element `0`, element `n`, element `2n`, and so on:
963
+ # If ` + step` decreases the value, iteration is still performed when step
964
+ # `begin` is higher than the `end`:
976
965
  #
977
- # a = []
978
- # (1..5).step(2) {|element| a.push(element) } # => 1..5
979
- # a # => [1, 3, 5]
980
- # a = []
981
- # ('a'..'e').step(2) {|element| a.push(element) } # => "a".."e"
982
- # a # => ["a", "c", "e"]
966
+ # (0..6).step(-2) { puts _1 }
967
+ # # Prints nothing
968
+ #
969
+ # (6..0).step(-2) { puts _1 }
970
+ # # Prints: 6, 4, 2, 0
971
+ #
972
+ # (Time.utc(2022, 3, 1)..Time.utc(2022, 2, 24)).step(-24*60*60) { puts _1 }
973
+ # # Prints:
974
+ # # 2022-03-01 00:00:00 UTC
975
+ # # 2022-02-28 00:00:00 UTC
976
+ # # 2022-02-27 00:00:00 UTC
977
+ # # 2022-02-26 00:00:00 UTC
978
+ # # 2022-02-25 00:00:00 UTC
979
+ # # 2022-02-24 00:00:00 UTC
980
+ #
981
+ # When the block is not provided, and range boundaries and step are Numeric, the
982
+ # method returns Enumerator::ArithmeticSequence.
983
983
  #
984
- # With no block given, returns an enumerator, which will be of class
985
- # Enumerator::ArithmeticSequence if `self` is numeric; otherwise of class
986
- # Enumerator:
984
+ # (1..5).step(2) # => ((1..5).step(2))
985
+ # (1.0..).step(1.5) #=> ((1.0..).step(1.5))
986
+ # (..3r).step(1/3r) #=> ((..3/1).step((1/3)))
987
987
  #
988
- # e = (1..5).step(2) # => ((1..5).step(2))
989
- # e.class # => Enumerator::ArithmeticSequence
990
- # ('a'..'e').step # => #<Enumerator: ...>
988
+ # Enumerator::ArithmeticSequence can be further used as a value object for
989
+ # iteration or slicing of collections (see Array#[]). There is a convenience
990
+ # method #% with behavior similar to `step` to produce arithmetic sequences more
991
+ # expressively:
991
992
  #
992
- # Related: Range#%.
993
+ # # Same as (1..5).step(2)
994
+ # (1..5) % 2 # => ((1..5).%(2))
993
995
  #
994
- def step: (?Numeric | int n) -> Enumerator[Elem, self]
995
- | (?Numeric | int n) { (Elem element) -> void } -> self
996
+ # In a generic case, when the block is not provided, Enumerator is returned:
997
+ #
998
+ # ('a'..).step('b') #=> #<Enumerator: "a"..:step("b")>
999
+ # ('a'..).step('b').take(3) #=> ["a", "ab", "abb"]
1000
+ #
1001
+ # If `s` is not provided, it is considered `1` for ranges with numeric `begin`:
1002
+ #
1003
+ # (1..5).step { p _1 }
1004
+ # # Prints: 1, 2, 3, 4, 5
1005
+ #
1006
+ # For non-Numeric ranges, step absence is an error:
1007
+ #
1008
+ # (Time.utc(2022, 3, 1)..Time.utc(2022, 2, 24)).step { p _1 }
1009
+ # # raises: step is required for non-numeric ranges (ArgumentError)
1010
+ #
1011
+ # For backward compatibility reasons, String ranges support the iteration both
1012
+ # with string step and with integer step. In the latter case, the iteration is
1013
+ # performed by calculating the next values with String#succ:
1014
+ #
1015
+ # ('a'..'e').step(2) { p _1 }
1016
+ # # Prints: a, c, e
1017
+ # ('a'..'e').step { p _1 }
1018
+ # # Default step 1; prints: a, b, c, d, e
1019
+ #
1020
+ def step: (?Numeric | int) -> Enumerator[Elem, self]
1021
+ | (?Numeric | int) { (Elem element) -> void } -> self
1022
+ | (untyped) -> Enumerator[Elem, self]
1023
+ | (untyped) { (Elem element) -> void } -> self
996
1024
 
997
1025
  # <!--
998
1026
  # rdoc-file=range.c
@@ -1022,11 +1050,10 @@ class Range[out Elem] < Object
1022
1050
  # Returns `true` if and only if:
1023
1051
  #
1024
1052
  # * `other` is a range.
1025
- # * `other.begin eql? self.begin`.
1026
- # * `other.end eql? self.end`.
1053
+ # * `other.begin.eql?(self.begin)`.
1054
+ # * `other.end.eql?(self.end)`.
1027
1055
  # * `other.exclude_end? == self.exclude_end?`.
1028
1056
  #
1029
- #
1030
1057
  # Otherwise returns `false`.
1031
1058
  #
1032
1059
  # r = (1..5)
data/core/rational.rbs CHANGED
@@ -7,12 +7,10 @@
7
7
  #
8
8
  # * A [rational literal](rdoc-ref:syntax/literals.rdoc@Rational+Literals).
9
9
  #
10
- #
11
10
  # You can convert certain objects to Rationals with:
12
11
  #
13
12
  # * Method #Rational.
14
13
  #
15
- #
16
14
  # Examples
17
15
  #
18
16
  # Rational(1) #=> (1/1)