rbs 3.10.0 → 4.0.0.dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +3 -3
  3. data/.github/workflows/ruby.yml +24 -35
  4. data/.github/workflows/typecheck.yml +3 -1
  5. data/.github/workflows/windows.yml +2 -2
  6. data/.gitignore +0 -4
  7. data/CHANGELOG.md +0 -88
  8. data/README.md +1 -38
  9. data/Rakefile +20 -142
  10. data/Steepfile +1 -0
  11. data/config.yml +43 -1
  12. data/core/array.rbs +46 -100
  13. data/core/complex.rbs +21 -32
  14. data/core/dir.rbs +2 -2
  15. data/core/encoding.rbs +9 -6
  16. data/core/enumerable.rbs +3 -90
  17. data/core/enumerator.rbs +1 -18
  18. data/core/errno.rbs +0 -8
  19. data/core/errors.rbs +1 -28
  20. data/core/exception.rbs +2 -2
  21. data/core/fiber.rbs +4 -5
  22. data/core/file.rbs +12 -27
  23. data/core/file_test.rbs +1 -1
  24. data/core/float.rbs +22 -209
  25. data/core/gc.rbs +281 -417
  26. data/core/hash.rbs +727 -1024
  27. data/core/integer.rbs +38 -78
  28. data/core/io/buffer.rbs +7 -18
  29. data/core/io/wait.rbs +33 -11
  30. data/core/io.rbs +12 -14
  31. data/core/kernel.rbs +51 -57
  32. data/core/marshal.rbs +1 -1
  33. data/core/match_data.rbs +1 -1
  34. data/core/math.rbs +3 -42
  35. data/core/method.rbs +6 -14
  36. data/core/module.rbs +17 -88
  37. data/core/nil_class.rbs +3 -3
  38. data/core/numeric.rbs +16 -16
  39. data/core/object.rbs +3 -3
  40. data/core/object_space.rbs +15 -21
  41. data/core/proc.rbs +8 -15
  42. data/core/process.rbs +2 -2
  43. data/core/ractor.rbs +437 -278
  44. data/core/range.rbs +8 -7
  45. data/core/rational.rbs +24 -37
  46. data/core/rbs/unnamed/argf.rbs +2 -2
  47. data/core/rbs/unnamed/env_class.rbs +1 -1
  48. data/core/rbs/unnamed/random.rbs +2 -4
  49. data/core/regexp.rbs +20 -25
  50. data/core/ruby_vm.rbs +4 -6
  51. data/core/rubygems/errors.rbs +70 -3
  52. data/core/rubygems/rubygems.rbs +79 -11
  53. data/core/rubygems/version.rbs +3 -2
  54. data/core/set.rbs +359 -488
  55. data/core/string.rbs +1228 -3153
  56. data/core/struct.rbs +1 -1
  57. data/core/symbol.rbs +4 -4
  58. data/core/thread.rbs +29 -92
  59. data/core/time.rbs +9 -35
  60. data/core/trace_point.rbs +4 -7
  61. data/core/unbound_method.rbs +6 -14
  62. data/docs/collection.md +2 -2
  63. data/docs/gem.md +1 -0
  64. data/docs/sigs.md +3 -3
  65. data/ext/rbs_extension/ast_translation.c +1077 -944
  66. data/ext/rbs_extension/ast_translation.h +0 -7
  67. data/ext/rbs_extension/class_constants.c +83 -71
  68. data/ext/rbs_extension/class_constants.h +7 -4
  69. data/ext/rbs_extension/extconf.rb +2 -24
  70. data/ext/rbs_extension/legacy_location.c +172 -173
  71. data/ext/rbs_extension/legacy_location.h +3 -8
  72. data/ext/rbs_extension/main.c +289 -239
  73. data/ext/rbs_extension/rbs_extension.h +0 -3
  74. data/ext/rbs_extension/rbs_string_bridging.h +0 -4
  75. data/include/rbs/ast.h +98 -37
  76. data/include/rbs/defines.h +12 -38
  77. data/include/rbs/lexer.h +114 -126
  78. data/include/rbs/location.h +14 -14
  79. data/include/rbs/parser.h +37 -21
  80. data/include/rbs/string.h +5 -3
  81. data/include/rbs/util/rbs_allocator.h +19 -40
  82. data/include/rbs/util/rbs_assert.h +1 -12
  83. data/include/rbs/util/rbs_constant_pool.h +3 -3
  84. data/include/rbs/util/rbs_encoding.h +1 -3
  85. data/include/rbs/util/rbs_unescape.h +1 -2
  86. data/lib/rbs/ast/ruby/annotations.rb +119 -0
  87. data/lib/rbs/ast/ruby/comment_block.rb +221 -0
  88. data/lib/rbs/ast/ruby/declarations.rb +86 -0
  89. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +24 -0
  90. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  91. data/lib/rbs/ast/ruby/members.rb +213 -0
  92. data/lib/rbs/buffer.rb +104 -24
  93. data/lib/rbs/cli/validate.rb +40 -35
  94. data/lib/rbs/cli.rb +5 -6
  95. data/lib/rbs/collection/config/lockfile_generator.rb +0 -1
  96. data/lib/rbs/collection.rb +0 -1
  97. data/lib/rbs/definition.rb +6 -1
  98. data/lib/rbs/definition_builder/ancestor_builder.rb +65 -62
  99. data/lib/rbs/definition_builder/method_builder.rb +45 -30
  100. data/lib/rbs/definition_builder.rb +44 -9
  101. data/lib/rbs/environment/class_entry.rb +69 -0
  102. data/lib/rbs/environment/module_entry.rb +66 -0
  103. data/lib/rbs/environment.rb +244 -218
  104. data/lib/rbs/environment_loader.rb +3 -3
  105. data/lib/rbs/errors.rb +5 -4
  106. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  107. data/lib/rbs/inline_parser.rb +206 -0
  108. data/lib/rbs/location_aux.rb +35 -3
  109. data/lib/rbs/parser_aux.rb +11 -6
  110. data/lib/rbs/prototype/runtime.rb +2 -2
  111. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  112. data/lib/rbs/resolver/type_name_resolver.rb +38 -124
  113. data/lib/rbs/source.rb +99 -0
  114. data/lib/rbs/subtractor.rb +4 -3
  115. data/lib/rbs/test/type_check.rb +0 -14
  116. data/lib/rbs/types.rb +1 -3
  117. data/lib/rbs/version.rb +1 -1
  118. data/lib/rbs.rb +13 -1
  119. data/lib/rdoc/discover.rb +1 -1
  120. data/lib/rdoc_plugin/parser.rb +1 -1
  121. data/rbs.gemspec +1 -0
  122. data/sig/ancestor_builder.rbs +1 -1
  123. data/sig/ast/ruby/annotations.rbs +110 -0
  124. data/sig/ast/ruby/comment_block.rbs +119 -0
  125. data/sig/ast/ruby/declarations.rbs +60 -0
  126. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  127. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  128. data/sig/ast/ruby/members.rbs +72 -0
  129. data/sig/buffer.rbs +63 -5
  130. data/sig/definition.rbs +1 -0
  131. data/sig/definition_builder.rbs +1 -1
  132. data/sig/environment/class_entry.rbs +50 -0
  133. data/sig/environment/module_entry.rbs +50 -0
  134. data/sig/environment.rbs +28 -133
  135. data/sig/errors.rbs +13 -6
  136. data/sig/inline_parser/comment_association.rbs +71 -0
  137. data/sig/inline_parser.rbs +87 -0
  138. data/sig/location.rbs +32 -7
  139. data/sig/manifest.yaml +1 -0
  140. data/sig/method_builder.rbs +7 -4
  141. data/sig/parser.rbs +16 -20
  142. data/sig/resolver/type_name_resolver.rbs +7 -38
  143. data/sig/source.rbs +48 -0
  144. data/sig/types.rbs +1 -4
  145. data/src/ast.c +290 -201
  146. data/src/lexer.c +2813 -2902
  147. data/src/lexer.re +4 -0
  148. data/src/lexstate.c +155 -169
  149. data/src/location.c +40 -40
  150. data/src/parser.c +2665 -2433
  151. data/src/string.c +48 -0
  152. data/src/util/rbs_allocator.c +77 -80
  153. data/src/util/rbs_assert.c +10 -10
  154. data/src/util/rbs_buffer.c +2 -2
  155. data/src/util/rbs_constant_pool.c +15 -13
  156. data/src/util/rbs_encoding.c +4062 -20097
  157. data/src/util/rbs_unescape.c +48 -85
  158. data/stdlib/bigdecimal/0/big_decimal.rbs +82 -100
  159. data/stdlib/bigdecimal-math/0/big_math.rbs +8 -169
  160. data/stdlib/cgi/0/core.rbs +396 -2
  161. data/stdlib/cgi/0/manifest.yaml +0 -1
  162. data/stdlib/coverage/0/coverage.rbs +1 -3
  163. data/stdlib/date/0/date.rbs +59 -67
  164. data/stdlib/date/0/date_time.rbs +1 -1
  165. data/stdlib/delegate/0/delegator.rbs +7 -10
  166. data/stdlib/erb/0/erb.rbs +347 -737
  167. data/stdlib/fileutils/0/fileutils.rbs +13 -18
  168. data/stdlib/forwardable/0/forwardable.rbs +0 -3
  169. data/stdlib/json/0/json.rbs +48 -68
  170. data/stdlib/net-http/0/net-http.rbs +0 -3
  171. data/stdlib/objspace/0/objspace.rbs +4 -9
  172. data/stdlib/open-uri/0/open-uri.rbs +0 -40
  173. data/stdlib/openssl/0/openssl.rbs +228 -331
  174. data/stdlib/optparse/0/optparse.rbs +3 -3
  175. data/{core → stdlib/pathname/0}/pathname.rbs +355 -255
  176. data/stdlib/psych/0/psych.rbs +3 -3
  177. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  178. data/stdlib/resolv/0/resolv.rbs +68 -25
  179. data/stdlib/ripper/0/ripper.rbs +2 -5
  180. data/stdlib/singleton/0/singleton.rbs +0 -3
  181. data/stdlib/socket/0/socket.rbs +1 -13
  182. data/stdlib/socket/0/tcp_socket.rbs +2 -10
  183. data/stdlib/stringio/0/stringio.rbs +85 -1176
  184. data/stdlib/strscan/0/string_scanner.rbs +31 -31
  185. data/stdlib/tempfile/0/tempfile.rbs +3 -3
  186. data/stdlib/time/0/time.rbs +1 -1
  187. data/stdlib/timeout/0/timeout.rbs +7 -63
  188. data/stdlib/tsort/0/cyclic.rbs +0 -3
  189. data/stdlib/uri/0/common.rbs +2 -11
  190. data/stdlib/uri/0/file.rbs +1 -1
  191. data/stdlib/uri/0/generic.rbs +16 -17
  192. data/stdlib/uri/0/rfc2396_parser.rbs +7 -6
  193. data/stdlib/zlib/0/zstream.rbs +0 -1
  194. metadata +40 -12
  195. data/.clang-format +0 -74
  196. data/.clangd +0 -2
  197. data/.github/workflows/c-check.yml +0 -54
  198. data/core/ruby.rbs +0 -53
  199. data/docs/aliases.md +0 -79
  200. data/docs/encoding.md +0 -56
  201. data/ext/rbs_extension/compat.h +0 -10
  202. data/stdlib/cgi-escape/0/escape.rbs +0 -153
data/core/enumerator.rbs CHANGED
@@ -137,7 +137,7 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
137
137
 
138
138
  # <!--
139
139
  # rdoc-file=enumerator.c
140
- # - Enumerator.produce(initial = nil, size: nil) { |prev| block } -> enumerator
140
+ # - Enumerator.produce(initial = nil) { |prev| block } -> enumerator
141
141
  # -->
142
142
  # Creates an infinite enumerator from any block, just called over and over. The
143
143
  # result of the previous iteration is passed to the next one. If `initial` is
@@ -169,23 +169,6 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
169
169
  # Enumerator.produce { scanner.scan(PATTERN) }.slice_after { scanner.eos? }.first
170
170
  # # => ["7", "+", "38", "/", "6"]
171
171
  #
172
- # The optional `size` keyword argument specifies the size of the enumerator,
173
- # which can be retrieved by Enumerator#size. It can be an integer,
174
- # `Float::INFINITY`, a callable object (such as a lambda), or `nil` to indicate
175
- # unknown size. When not specified, the size defaults to `Float::INFINITY`.
176
- #
177
- # # Infinite enumerator
178
- # enum = Enumerator.produce(1, size: Float::INFINITY, &:succ)
179
- # enum.size # => Float::INFINITY
180
- #
181
- # # Finite enumerator with known/computable size
182
- # abs_dir = File.expand_path("./baz") # => "/foo/bar/baz"
183
- # traverser = Enumerator.produce(abs_dir, size: -> { abs_dir.count("/") + 1 }) {
184
- # raise StopIteration if it == "/"
185
- # File.dirname(it)
186
- # }
187
- # traverser.size # => 4
188
- #
189
172
  def self.produce: [T] () { (T? prev) -> T } -> Enumerator[T, bot]
190
173
  | [T] (T initial) { (T prev) -> T } -> Enumerator[T, bot]
191
174
 
data/core/errno.rbs CHANGED
@@ -38,14 +38,6 @@
38
38
  # Errno::ENOENT::Errno # => 2
39
39
  # Errno::ENOTCAPABLE::Errno # => 0
40
40
  #
41
- # Each class in Errno can be created with optional messages:
42
- #
43
- # Errno::EPIPE.new # => #<Errno::EPIPE: Broken pipe>
44
- # Errno::EPIPE.new("foo") # => #<Errno::EPIPE: Broken pipe - foo>
45
- # Errno::EPIPE.new("foo", "here") # => #<Errno::EPIPE: Broken pipe @ here - foo>
46
- #
47
- # See SystemCallError.new.
48
- #
49
41
  module Errno
50
42
  class NOERROR < SystemCallError
51
43
  Errno: 0
data/core/errors.rbs CHANGED
@@ -302,15 +302,9 @@ class NameError[T] < StandardError
302
302
  def receiver: () -> T?
303
303
  end
304
304
 
305
- # <!-- rdoc-file=error.c -->
306
- # Raised when matching pattern not found.
307
- #
308
305
  class NoMatchingPatternError < StandardError
309
306
  end
310
307
 
311
- # <!-- rdoc-file=error.c -->
312
- # Raised when matching key not found.
313
- #
314
308
  class NoMatchingPatternKeyError[M, K] < NoMatchingPatternError
315
309
  # <!--
316
310
  # rdoc-file=error.c
@@ -594,34 +588,13 @@ end
594
588
  class SystemCallError < StandardError
595
589
  # <!--
596
590
  # rdoc-file=error.c
597
- # - SystemCallError.new(msg, errno = nil, func = nil) -> system_call_error_subclass
591
+ # - SystemCallError.new(msg, errno) -> system_call_error_subclass
598
592
  # -->
599
593
  # If *errno* corresponds to a known system error code, constructs the
600
594
  # appropriate Errno class for that error, otherwise constructs a generic
601
595
  # SystemCallError object. The error number is subsequently available via the
602
596
  # #errno method.
603
597
  #
604
- # If only numeric object is given, it is treated as an Integer *errno*, and
605
- # *msg* is omitted, otherwise the first argument *msg* is used as the additional
606
- # error message.
607
- #
608
- # SystemCallError.new(Errno::EPIPE::Errno)
609
- # #=> #<Errno::EPIPE: Broken pipe>
610
- #
611
- # SystemCallError.new("foo")
612
- # #=> #<SystemCallError: unknown error - foo>
613
- #
614
- # SystemCallError.new("foo", Errno::EPIPE::Errno)
615
- # #=> #<Errno::EPIPE: Broken pipe - foo>
616
- #
617
- # If *func* is not `nil`, it is appended to the message with "` @ `".
618
- #
619
- # SystemCallError.new("foo", Errno::EPIPE::Errno, "here")
620
- # #=> #<Errno::EPIPE: Broken pipe @ here - foo>
621
- #
622
- # A subclass of SystemCallError can also be instantiated via the `new` method of
623
- # the subclass. See Errno.
624
- #
625
598
  def initialize: (string msg, Integer errno) -> void
626
599
 
627
600
  # <!--
data/core/exception.rbs CHANGED
@@ -118,7 +118,7 @@ class Exception
118
118
  # # String
119
119
  # end
120
120
  #
121
- # The value returned by this method might be adjusted when raising (see
121
+ # The value returned by this method migth be adjusted when raising (see
122
122
  # Kernel#raise), or during intermediate handling by #set_backtrace.
123
123
  #
124
124
  # See also #backtrace_locations that provide the same value, as structured
@@ -447,7 +447,7 @@ class Exception
447
447
  # * If the value of keyword `order` is `:top` (the default), lists the
448
448
  # error message and the innermost backtrace entry first.
449
449
  # * If the value of keyword `order` is `:bottom`, lists the error message
450
- # the innermost entry last.
450
+ # the the innermost entry last.
451
451
  #
452
452
  # Example:
453
453
  #
data/core/fiber.rbs CHANGED
@@ -58,7 +58,7 @@
58
58
  # ## Non-blocking Fibers
59
59
  #
60
60
  # The concept of *non-blocking fiber* was introduced in Ruby 3.0. A non-blocking
61
- # fiber, when reaching an operation that would normally block the fiber (like
61
+ # fiber, when reaching a operation that would normally block the fiber (like
62
62
  # `sleep`, or wait for another process or I/O) will yield control to other
63
63
  # fibers and allow the *scheduler* to handle blocking and waking up (resuming)
64
64
  # this fiber when it can proceed.
@@ -82,8 +82,7 @@ class Fiber < Object
82
82
  # -->
83
83
  # Returns the value of the fiber storage variable identified by `key`.
84
84
  #
85
- # The `key` must be a symbol, and the value is set by Fiber#[]= or
86
- # Fiber#storage.
85
+ # The `key` must be a symbol, and the value is set by Fiber#[]= or Fiber#store.
87
86
  #
88
87
  # See also Fiber::[]=.
89
88
  #
@@ -415,8 +414,8 @@ class Fiber < Object
415
414
  #
416
415
  # See Kernel#raise for more information.
417
416
  #
418
- def raise: (?string msg, ?cause: Exception?) -> untyped
419
- | (_Exception, ?string msg, ?Array[string] | Array[Thread::Backtrace::Location] | nil backtrace, ?cause: Exception?) -> untyped
417
+ def raise: (?string msg) -> untyped
418
+ | (_Exception, ?string msg, ?Array[string] | Array[Thread::Backtrace::Location] | nil backtrace) -> untyped
420
419
 
421
420
  # <!--
422
421
  # rdoc-file=cont.c
data/core/file.rbs CHANGED
@@ -1414,7 +1414,7 @@ class File < IO
1414
1414
  # rdoc-file=file.c
1415
1415
  # - File.owned?(file_name) -> true or false
1416
1416
  # -->
1417
- # Returns `true` if the named file exists and the effective user id of the
1417
+ # Returns `true` if the named file exists and the effective used id of the
1418
1418
  # calling process is the owner of the file.
1419
1419
  #
1420
1420
  # *file_name* can be an IO object.
@@ -1427,25 +1427,8 @@ class File < IO
1427
1427
  # -->
1428
1428
  # Returns the string representation of the path
1429
1429
  #
1430
- # File.path(File::NULL) #=> "/dev/null"
1431
- # File.path(Pathname.new("/tmp")) #=> "/tmp"
1432
- #
1433
- # If `path` is not a String:
1434
- #
1435
- # 1. If it has the `to_path` method, that method will be called to coerce to a
1436
- # String.
1437
- #
1438
- # 2. Otherwise, or if the coerced result is not a String too, the standard
1439
- # coersion using `to_str` method will take place on that object. (See also
1440
- # String.try_convert)
1441
- #
1442
- # The coerced string must satisfy the following conditions:
1443
- #
1444
- # 1. It must be in an ASCII-compatible encoding; otherwise, an
1445
- # Encoding::CompatibilityError is raised.
1446
- #
1447
- # 2. It must not contain the NUL character (`\0`); otherwise, an ArgumentError
1448
- # is raised.
1430
+ # File.path(File::NULL) #=> "/dev/null"
1431
+ # File.path(Pathname.new("/tmp")) #=> "/tmp"
1449
1432
  #
1450
1433
  def self.path: (string | _ToPath path) -> String
1451
1434
 
@@ -1839,12 +1822,12 @@ class File < IO
1839
1822
  # Returns `false` if `File::LOCK_NB` is specified and the operation would have
1840
1823
  # blocked;
1841
1824
  # otherwise returns `0`.
1842
- # Constant | Lock | Effect
1843
- # ---------------|------------|-------------------------------------------------------------------------------------------------------
1844
- # `File::LOCK_EX`| Exclusive | Only one process may hold an exclusive lock for `self` at a time.
1845
- # `File::LOCK_NB`|Non-blocking|No blocking; may be combined with `File::LOCK_SH` or `File::LOCK_EX` using the bitwise OR operator `|`.
1846
- # `File::LOCK_SH`| Shared | Multiple processes may each hold a shared lock for `self` at the same time.
1847
- # `File::LOCK_UN`| Unlock | Remove an existing lock held by this process.
1825
+ # Constant | Lock | Effect
1826
+ # ---------------|------------|--------------------------------------------------------------------------------------------------------------
1827
+ # +File::LOCK_EX+| Exclusive | Only one process may hold an exclusive lock for +self+ at a time.
1828
+ # +File::LOCK_NB+|Non-blocking|No blocking; may be combined with +File::LOCK_SH+ or +File::LOCK_EX+ using the bitwise OR operator <tt>|</tt>.
1829
+ # +File::LOCK_SH+| Shared | Multiple processes may each hold a shared lock for +self+ at the same time.
1830
+ # +File::LOCK_UN+| Unlock | Remove an existing lock held by this process.
1848
1831
  # Example:
1849
1832
  # # Update a counter using an exclusive lock.
1850
1833
  # # Don't use File::WRONLY because it truncates the file.
@@ -2446,8 +2429,10 @@ class File::Stat < Object
2446
2429
 
2447
2430
  # <!--
2448
2431
  # rdoc-file=file.c
2449
- # - File::Stat.new(file_name) -> stat
2432
+ # - new(p1)
2450
2433
  # -->
2434
+ # File::Stat.new(file_name) -> stat
2435
+ #
2451
2436
  # Create a File::Stat object for the given file name (raising an exception if
2452
2437
  # the file doesn't exist).
2453
2438
  #
data/core/file_test.rbs CHANGED
@@ -145,7 +145,7 @@ module FileTest
145
145
  # rdoc-file=file.c
146
146
  # - File.owned?(file_name) -> true or false
147
147
  # -->
148
- # Returns `true` if the named file exists and the effective user id of the
148
+ # Returns `true` if the named file exists and the effective used id of the
149
149
  # calling process is the owner of the file.
150
150
  #
151
151
  # *file_name* can be an IO object.
data/core/float.rbs CHANGED
@@ -1,193 +1,15 @@
1
- # <!-- rdoc-file=float.rb -->
2
- # A Float object stores a real number using the native architecture's
3
- # double-precision floating-point representation.
4
- #
5
- # ## Float Imprecisions
6
- #
7
- # Some real numbers can be represented precisely as Float objects:
8
- #
9
- # 37.5 # => 37.5
10
- # 98.75 # => 98.75
11
- # 12.3125 # => 12.3125
12
- #
13
- # Others cannot; among these are the transcendental numbers, including:
14
- #
15
- # * Pi, *π*: in mathematics, a number of infinite precision:
16
- # 3.1415926535897932384626433... (to 25 places); in Ruby, it is of limited
17
- # precision (in this case, to 16 decimal places):
18
- #
19
- # Math::PI # => 3.141592653589793
20
- #
21
- # * Euler's number, *e*: in mathematics, a number of infinite precision:
22
- # 2.7182818284590452353602874... (to 25 places); in Ruby, it is of limited
23
- # precision (in this case, to 15 decimal places):
24
- #
25
- # Math::E # => 2.718281828459045
26
- #
27
- # Some floating-point computations in Ruby give precise results:
28
- #
29
- # 1.0/2 # => 0.5
30
- # 100.0/8 # => 12.5
31
- #
32
- # Others do not:
33
- #
34
- # * In mathematics, 2/3 as a decimal number is an infinitely-repeating
35
- # decimal: 0.666... (forever); in Ruby, `2.0/3` is of limited precision (in
36
- # this case, to 16 decimal places):
37
- #
38
- # 2.0/3 # => 0.6666666666666666
39
- #
40
- # * In mathematics, the square root of 2 is an irrational number of infinite
41
- # precision: 1.4142135623730950488016887... (to 25 decimal places); in Ruby,
42
- # it is of limited precision (in this case, to 16 decimal places):
43
- #
44
- # Math.sqrt(2.0) # => 1.4142135623730951
45
- #
46
- # * Even a simple computation can introduce imprecision:
47
- #
48
- # x = 0.1 + 0.2 # => 0.30000000000000004
49
- # y = 0.3 # => 0.3
50
- # x == y # => false
51
- #
52
- # See:
53
- #
54
- # * https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
55
- # * https://github.com/rdp/ruby_tutorials_core/wiki/Ruby-Talk-FAQ#-why-are-rub
56
- # ys-floats-imprecise
57
- # * https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
58
- #
59
- # Note that precise storage and computation of rational numbers is possible
60
- # using Rational objects.
61
- #
62
- # ## Creating a Float
63
- #
64
- # You can create a Float object explicitly with:
65
- #
66
- # * A [floating-point literal](rdoc-ref:syntax/literals.rdoc@Float+Literals).
67
- #
68
- # You can convert certain objects to Floats with:
69
- #
70
- # * Method #Float.
71
- #
72
- # ## What's Here
73
- #
74
- # First, what's elsewhere. Class Float:
75
- #
76
- # * Inherits from [class Numeric](rdoc-ref:Numeric@What-27s+Here) and [class
77
- # Object](rdoc-ref:Object@What-27s+Here).
78
- # * Includes [module Comparable](rdoc-ref:Comparable@What-27s+Here).
79
- #
80
- # Here, class Float provides methods for:
81
- #
82
- # * [Querying](rdoc-ref:Float@Querying)
83
- # * [Comparing](rdoc-ref:Float@Comparing)
84
- # * [Converting](rdoc-ref:Float@Converting)
85
- #
86
- # ### Querying
87
- #
88
- # * #finite?: Returns whether `self` is finite.
89
- # * #hash: Returns the integer hash code for `self`.
90
- # * #infinite?: Returns whether `self` is infinite.
91
- # * #nan?: Returns whether `self` is a NaN (not-a-number).
92
- #
93
- # ### Comparing
94
- #
95
- # * #<: Returns whether `self` is less than the given value.
96
- # * #<=: Returns whether `self` is less than or equal to the given value.
97
- # * #<=>: Returns a number indicating whether `self` is less than, equal to,
98
- # or greater than the given value.
99
- # * #== (aliased as #=== and #eql?): Returns whether `self` is equal to the
100
- # given value.
101
- # * #>: Returns whether `self` is greater than the given value.
102
- # * #>=: Returns whether `self` is greater than or equal to the given value.
103
- #
104
- # ### Converting
105
- #
106
- # * #% (aliased as #modulo): Returns `self` modulo the given value.
107
- # * #*: Returns the product of `self` and the given value.
108
- # * #**: Returns the value of `self` raised to the power of the given value.
109
- # * #+: Returns the sum of `self` and the given value.
110
- # * #-: Returns the difference of `self` and the given value.
111
- # * #/: Returns the quotient of `self` and the given value.
112
- # * #ceil: Returns the smallest number greater than or equal to `self`.
113
- # * #coerce: Returns a 2-element array containing the given value converted to
114
- # a Float and `self`
115
- # * #divmod: Returns a 2-element array containing the quotient and remainder
116
- # results of dividing `self` by the given value.
117
- # * #fdiv: Returns the Float result of dividing `self` by the given value.
118
- # * #floor: Returns the greatest number smaller than or equal to `self`.
119
- # * #next_float: Returns the next-larger representable Float.
120
- # * #prev_float: Returns the next-smaller representable Float.
121
- # * #quo: Returns the quotient from dividing `self` by the given value.
122
- # * #round: Returns `self` rounded to the nearest value, to a given precision.
123
- # * #to_i (aliased as #to_int): Returns `self` truncated to an Integer.
124
- # * #to_s (aliased as #inspect): Returns a string containing the place-value
125
- # representation of `self` in the given radix.
126
- # * #truncate: Returns `self` truncated to a given precision.
127
- #
128
- # <!-- rdoc-file=float.rb -->
129
- # A Float object stores a real number using the native architecture's
130
- # double-precision floating-point representation.
131
- #
132
- # ## Float Imprecisions
133
- #
134
- # Some real numbers can be represented precisely as Float objects:
135
- #
136
- # 37.5 # => 37.5
137
- # 98.75 # => 98.75
138
- # 12.3125 # => 12.3125
139
- #
140
- # Others cannot; among these are the transcendental numbers, including:
141
- #
142
- # * Pi, *π*: in mathematics, a number of infinite precision:
143
- # 3.1415926535897932384626433... (to 25 places); in Ruby, it is of limited
144
- # precision (in this case, to 16 decimal places):
145
- #
146
- # Math::PI # => 3.141592653589793
147
- #
148
- # * Euler's number, *e*: in mathematics, a number of infinite precision:
149
- # 2.7182818284590452353602874... (to 25 places); in Ruby, it is of limited
150
- # precision (in this case, to 15 decimal places):
151
- #
152
- # Math::E # => 2.718281828459045
153
- #
154
- # Some floating-point computations in Ruby give precise results:
155
- #
156
- # 1.0/2 # => 0.5
157
- # 100.0/8 # => 12.5
158
- #
159
- # Others do not:
160
- #
161
- # * In mathematics, 2/3 as a decimal number is an infinitely-repeating
162
- # decimal: 0.666... (forever); in Ruby, `2.0/3` is of limited precision (in
163
- # this case, to 16 decimal places):
164
- #
165
- # 2.0/3 # => 0.6666666666666666
166
- #
167
- # * In mathematics, the square root of 2 is an irrational number of infinite
168
- # precision: 1.4142135623730950488016887... (to 25 decimal places); in Ruby,
169
- # it is of limited precision (in this case, to 16 decimal places):
170
- #
171
- # Math.sqrt(2.0) # => 1.4142135623730951
172
- #
173
- # * Even a simple computation can introduce imprecision:
174
- #
175
- # x = 0.1 + 0.2 # => 0.30000000000000004
176
- # y = 0.3 # => 0.3
177
- # x == y # => false
1
+ # <!-- rdoc-file=numeric.c -->
2
+ # A Float object represents a sometimes-inexact real number using the native
3
+ # architecture's double-precision floating point representation.
178
4
  #
179
- # See:
5
+ # Floating point has a different arithmetic and is an inexact number. So you
6
+ # should know its esoteric system. See following:
180
7
  #
181
8
  # * https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
182
9
  # * https://github.com/rdp/ruby_tutorials_core/wiki/Ruby-Talk-FAQ#-why-are-rub
183
10
  # ys-floats-imprecise
184
11
  # * https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
185
12
  #
186
- # Note that precise storage and computation of rational numbers is possible
187
- # using Rational objects.
188
- #
189
- # ## Creating a Float
190
- #
191
13
  # You can create a Float object explicitly with:
192
14
  #
193
15
  # * A [floating-point literal](rdoc-ref:syntax/literals.rdoc@Float+Literals).
@@ -257,7 +79,7 @@ class Float < Numeric
257
79
  # rdoc-file=numeric.c
258
80
  # - self % other -> float
259
81
  # -->
260
- # Returns `self` modulo `other` as a Float.
82
+ # Returns `self` modulo `other` as a float.
261
83
  #
262
84
  # For float `f` and real number `r`, these expressions are equivalent:
263
85
  #
@@ -289,7 +111,7 @@ class Float < Numeric
289
111
  # rdoc-file=numeric.c
290
112
  # - self * other -> numeric
291
113
  # -->
292
- # Returns the numeric product of `self` and `other`:
114
+ # Returns a new Float which is the product of `self` and `other`:
293
115
  #
294
116
  # f = 3.14
295
117
  # f * 2 # => 6.28
@@ -302,9 +124,9 @@ class Float < Numeric
302
124
 
303
125
  # <!--
304
126
  # rdoc-file=numeric.c
305
- # - self ** exponent -> numeric
127
+ # - self ** other -> numeric
306
128
  # -->
307
- # Returns `self` raised to the power `exponent`:
129
+ # Raises `self` to the power of `other`:
308
130
  #
309
131
  # f = 3.14
310
132
  # f ** 2 # => 9.8596
@@ -318,20 +140,15 @@ class Float < Numeric
318
140
 
319
141
  # <!--
320
142
  # rdoc-file=numeric.c
321
- # - self + other -> float or complex
143
+ # - self + other -> numeric
322
144
  # -->
323
- # Returns the sum of `self` and `other`; the result may be inexact (see Float):
324
- #
325
- # 3.14 + 0 # => 3.14
326
- # 3.14 + 1 # => 4.140000000000001
327
- # -3.14 + 0 # => -3.14
328
- # -3.14 + 1 # => -2.14
145
+ # Returns a new Float which is the sum of `self` and `other`:
329
146
  #
330
- # 3.14 + -3.14 # => 0.0
331
- # -3.14 + -3.14 # => -6.28
332
- #
333
- # 3.14 + Complex(1, 0) # => (4.140000000000001+0i)
334
- # 3.14 + Rational(1, 1) # => 4.140000000000001
147
+ # f = 3.14
148
+ # f + 1 # => 4.140000000000001
149
+ # f + 1.0 # => 4.140000000000001
150
+ # f + Rational(1, 1) # => 4.140000000000001
151
+ # f + Complex(1, 0) # => (4.140000000000001+0i)
335
152
  #
336
153
  def +: (Complex) -> Complex
337
154
  | (Numeric) -> Float
@@ -342,7 +159,7 @@ class Float < Numeric
342
159
  # rdoc-file=numeric.c
343
160
  # - self - other -> numeric
344
161
  # -->
345
- # Returns the difference of `self` and `other`:
162
+ # Returns a new Float which is the difference of `self` and `other`:
346
163
  #
347
164
  # f = 3.14
348
165
  # f - 1 # => 2.14
@@ -355,13 +172,9 @@ class Float < Numeric
355
172
 
356
173
  # <!--
357
174
  # rdoc-file=numeric.rb
358
- # - -self -> float
175
+ # - -float -> float
359
176
  # -->
360
- # Returns `self`, negated:
361
- #
362
- # -3.14 # => -3.14
363
- # -(-3.14) # => 3.14
364
- # -0.0 # => -0.0
177
+ # Returns `self`, negated.
365
178
  #
366
179
  def -@: () -> Float
367
180
 
@@ -369,7 +182,7 @@ class Float < Numeric
369
182
  # rdoc-file=numeric.c
370
183
  # - self / other -> numeric
371
184
  # -->
372
- # Returns the quotient of `self` and `other`:
185
+ # Returns a new Float which is the result of dividing `self` by `other`:
373
186
  #
374
187
  # f = 3.14
375
188
  # f / 2 # => 1.57
@@ -833,7 +646,7 @@ class Float < Numeric
833
646
  alias magnitude abs
834
647
 
835
648
  # <!-- rdoc-file=numeric.c -->
836
- # Returns `self` modulo `other` as a Float.
649
+ # Returns `self` modulo `other` as a float.
837
650
  #
838
651
  # For float `f` and real number `r`, these expressions are equivalent:
839
652
  #
@@ -1281,7 +1094,7 @@ Float::MAX_EXP: Integer
1281
1094
  # Usually defaults to 2.2250738585072014e-308.
1282
1095
  #
1283
1096
  # If the platform supports denormalized numbers, there are numbers between zero
1284
- # and Float::MIN. `0.0.next_float` returns the smallest positive floating point
1097
+ # and Float::MIN. 0.0.next_float returns the smallest positive floating point
1285
1098
  # number including denormalized numbers.
1286
1099
  #
1287
1100
  Float::MIN: Float