rbs 0.2.0

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 (132) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +28 -0
  3. data/.gitignore +12 -0
  4. data/.rubocop.yml +15 -0
  5. data/BSDL +22 -0
  6. data/CHANGELOG.md +9 -0
  7. data/COPYING +56 -0
  8. data/Gemfile +6 -0
  9. data/README.md +93 -0
  10. data/Rakefile +142 -0
  11. data/bin/annotate-with-rdoc +157 -0
  12. data/bin/console +14 -0
  13. data/bin/query-rdoc +103 -0
  14. data/bin/setup +10 -0
  15. data/bin/sort +89 -0
  16. data/bin/test_runner.rb +16 -0
  17. data/docs/CONTRIBUTING.md +97 -0
  18. data/docs/sigs.md +148 -0
  19. data/docs/stdlib.md +152 -0
  20. data/docs/syntax.md +528 -0
  21. data/exe/rbs +7 -0
  22. data/lib/rbs.rb +64 -0
  23. data/lib/rbs/ast/annotation.rb +27 -0
  24. data/lib/rbs/ast/comment.rb +27 -0
  25. data/lib/rbs/ast/declarations.rb +395 -0
  26. data/lib/rbs/ast/members.rb +362 -0
  27. data/lib/rbs/buffer.rb +50 -0
  28. data/lib/rbs/builtin_names.rb +55 -0
  29. data/lib/rbs/cli.rb +558 -0
  30. data/lib/rbs/constant.rb +26 -0
  31. data/lib/rbs/constant_table.rb +150 -0
  32. data/lib/rbs/definition.rb +170 -0
  33. data/lib/rbs/definition_builder.rb +919 -0
  34. data/lib/rbs/environment.rb +281 -0
  35. data/lib/rbs/environment_loader.rb +136 -0
  36. data/lib/rbs/environment_walker.rb +124 -0
  37. data/lib/rbs/errors.rb +187 -0
  38. data/lib/rbs/location.rb +102 -0
  39. data/lib/rbs/method_type.rb +123 -0
  40. data/lib/rbs/namespace.rb +91 -0
  41. data/lib/rbs/parser.y +1344 -0
  42. data/lib/rbs/prototype/rb.rb +553 -0
  43. data/lib/rbs/prototype/rbi.rb +587 -0
  44. data/lib/rbs/prototype/runtime.rb +381 -0
  45. data/lib/rbs/substitution.rb +46 -0
  46. data/lib/rbs/test.rb +26 -0
  47. data/lib/rbs/test/errors.rb +61 -0
  48. data/lib/rbs/test/hook.rb +294 -0
  49. data/lib/rbs/test/setup.rb +58 -0
  50. data/lib/rbs/test/spy.rb +325 -0
  51. data/lib/rbs/test/test_helper.rb +183 -0
  52. data/lib/rbs/test/type_check.rb +254 -0
  53. data/lib/rbs/type_name.rb +70 -0
  54. data/lib/rbs/types.rb +936 -0
  55. data/lib/rbs/variance_calculator.rb +138 -0
  56. data/lib/rbs/vendorer.rb +47 -0
  57. data/lib/rbs/version.rb +3 -0
  58. data/lib/rbs/writer.rb +269 -0
  59. data/lib/ruby/signature.rb +7 -0
  60. data/rbs.gemspec +46 -0
  61. data/stdlib/abbrev/abbrev.rbs +60 -0
  62. data/stdlib/base64/base64.rbs +71 -0
  63. data/stdlib/benchmark/benchmark.rbs +372 -0
  64. data/stdlib/builtin/array.rbs +1997 -0
  65. data/stdlib/builtin/basic_object.rbs +280 -0
  66. data/stdlib/builtin/binding.rbs +177 -0
  67. data/stdlib/builtin/builtin.rbs +45 -0
  68. data/stdlib/builtin/class.rbs +145 -0
  69. data/stdlib/builtin/comparable.rbs +116 -0
  70. data/stdlib/builtin/complex.rbs +400 -0
  71. data/stdlib/builtin/constants.rbs +37 -0
  72. data/stdlib/builtin/data.rbs +5 -0
  73. data/stdlib/builtin/deprecated.rbs +2 -0
  74. data/stdlib/builtin/dir.rbs +413 -0
  75. data/stdlib/builtin/encoding.rbs +607 -0
  76. data/stdlib/builtin/enumerable.rbs +404 -0
  77. data/stdlib/builtin/enumerator.rbs +260 -0
  78. data/stdlib/builtin/errno.rbs +781 -0
  79. data/stdlib/builtin/errors.rbs +582 -0
  80. data/stdlib/builtin/exception.rbs +194 -0
  81. data/stdlib/builtin/false_class.rbs +40 -0
  82. data/stdlib/builtin/fiber.rbs +68 -0
  83. data/stdlib/builtin/fiber_error.rbs +12 -0
  84. data/stdlib/builtin/file.rbs +1076 -0
  85. data/stdlib/builtin/file_test.rbs +59 -0
  86. data/stdlib/builtin/float.rbs +696 -0
  87. data/stdlib/builtin/gc.rbs +243 -0
  88. data/stdlib/builtin/hash.rbs +1029 -0
  89. data/stdlib/builtin/integer.rbs +707 -0
  90. data/stdlib/builtin/io.rbs +683 -0
  91. data/stdlib/builtin/kernel.rbs +576 -0
  92. data/stdlib/builtin/marshal.rbs +161 -0
  93. data/stdlib/builtin/match_data.rbs +271 -0
  94. data/stdlib/builtin/math.rbs +369 -0
  95. data/stdlib/builtin/method.rbs +185 -0
  96. data/stdlib/builtin/module.rbs +1104 -0
  97. data/stdlib/builtin/nil_class.rbs +82 -0
  98. data/stdlib/builtin/numeric.rbs +409 -0
  99. data/stdlib/builtin/object.rbs +824 -0
  100. data/stdlib/builtin/proc.rbs +429 -0
  101. data/stdlib/builtin/process.rbs +1227 -0
  102. data/stdlib/builtin/random.rbs +267 -0
  103. data/stdlib/builtin/range.rbs +226 -0
  104. data/stdlib/builtin/rational.rbs +424 -0
  105. data/stdlib/builtin/rb_config.rbs +57 -0
  106. data/stdlib/builtin/regexp.rbs +1083 -0
  107. data/stdlib/builtin/ruby_vm.rbs +14 -0
  108. data/stdlib/builtin/signal.rbs +55 -0
  109. data/stdlib/builtin/string.rbs +1901 -0
  110. data/stdlib/builtin/string_io.rbs +284 -0
  111. data/stdlib/builtin/struct.rbs +40 -0
  112. data/stdlib/builtin/symbol.rbs +228 -0
  113. data/stdlib/builtin/thread.rbs +1108 -0
  114. data/stdlib/builtin/thread_group.rbs +23 -0
  115. data/stdlib/builtin/time.rbs +1047 -0
  116. data/stdlib/builtin/trace_point.rbs +290 -0
  117. data/stdlib/builtin/true_class.rbs +46 -0
  118. data/stdlib/builtin/unbound_method.rbs +153 -0
  119. data/stdlib/builtin/warning.rbs +17 -0
  120. data/stdlib/coverage/coverage.rbs +62 -0
  121. data/stdlib/csv/csv.rbs +773 -0
  122. data/stdlib/erb/erb.rbs +392 -0
  123. data/stdlib/find/find.rbs +40 -0
  124. data/stdlib/ipaddr/ipaddr.rbs +247 -0
  125. data/stdlib/json/json.rbs +335 -0
  126. data/stdlib/pathname/pathname.rbs +1093 -0
  127. data/stdlib/prime/integer-extension.rbs +23 -0
  128. data/stdlib/prime/prime.rbs +188 -0
  129. data/stdlib/securerandom/securerandom.rbs +9 -0
  130. data/stdlib/set/set.rbs +301 -0
  131. data/stdlib/tmpdir/tmpdir.rbs +53 -0
  132. metadata +292 -0
@@ -0,0 +1,243 @@
1
+ # The GC module provides an interface to Ruby's mark and sweep garbage
2
+ # collection mechanism.
3
+ #
4
+ # Some of the underlying methods are also available via the ObjectSpace module.
5
+ #
6
+ # You may obtain information about the operation of the GC through GC::Profiler.
7
+ #
8
+ module GC
9
+ # The number of times GC occurred.
10
+ #
11
+ # It returns the number of times GC occurred since the process started.
12
+ #
13
+ def self.count: () -> Integer
14
+
15
+ # Disables garbage collection, returning `true` if garbage collection was
16
+ # already disabled.
17
+ #
18
+ # GC.disable #=> false
19
+ # GC.disable #=> true
20
+ #
21
+ def self.disable: () -> bool
22
+
23
+ # Enables garbage collection, returning `true` if garbage collection was
24
+ # previously disabled.
25
+ #
26
+ # GC.disable #=> false
27
+ # GC.enable #=> true
28
+ # GC.enable #=> false
29
+ #
30
+ def self.enable: () -> bool
31
+
32
+ # Initiates garbage collection, even if manually disabled.
33
+ #
34
+ # This method is defined with keyword arguments that default to true:
35
+ #
36
+ # def GC.start(full_mark: true, immediate_sweep: true); end
37
+ #
38
+ # Use full_mark: false to perform a minor GC. Use immediate_sweep: false to
39
+ # defer sweeping (use lazy sweep).
40
+ #
41
+ # Note: These keyword arguments are implementation and version dependent. They
42
+ # are not guaranteed to be future-compatible, and may be ignored if the
43
+ # underlying implementation does not support them.
44
+ #
45
+ def self.start: (?immediate_sweep: bool immediate_sweep, ?immediate_mark: bool immediate_mark, ?full_mark: bool full_mark) -> nil
46
+
47
+ # Returns a Hash containing information about the GC.
48
+ #
49
+ # The hash includes information about internal statistics about GC such as:
50
+ #
51
+ # {
52
+ # :count=>0,
53
+ # :heap_allocated_pages=>24,
54
+ # :heap_sorted_length=>24,
55
+ # :heap_allocatable_pages=>0,
56
+ # :heap_available_slots=>9783,
57
+ # :heap_live_slots=>7713,
58
+ # :heap_free_slots=>2070,
59
+ # :heap_final_slots=>0,
60
+ # :heap_marked_slots=>0,
61
+ # :heap_eden_pages=>24,
62
+ # :heap_tomb_pages=>0,
63
+ # :total_allocated_pages=>24,
64
+ # :total_freed_pages=>0,
65
+ # :total_allocated_objects=>7796,
66
+ # :total_freed_objects=>83,
67
+ # :malloc_increase_bytes=>2389312,
68
+ # :malloc_increase_bytes_limit=>16777216,
69
+ # :minor_gc_count=>0,
70
+ # :major_gc_count=>0,
71
+ # :remembered_wb_unprotected_objects=>0,
72
+ # :remembered_wb_unprotected_objects_limit=>0,
73
+ # :old_objects=>0,
74
+ # :old_objects_limit=>0,
75
+ # :oldmalloc_increase_bytes=>2389760,
76
+ # :oldmalloc_increase_bytes_limit=>16777216
77
+ # }
78
+ #
79
+ # The contents of the hash are implementation specific and may be changed in the
80
+ # future.
81
+ #
82
+ # This method is only expected to work on C Ruby.
83
+ #
84
+ def self.stat: (?::Hash[Symbol, Integer] arg0) -> ::Hash[Symbol, Integer]
85
+ | (?Symbol arg0) -> Integer
86
+
87
+ # Returns current status of GC stress mode.
88
+ #
89
+ def self.stress: () -> (Integer | TrueClass | FalseClass)
90
+
91
+ # Updates the GC stress mode.
92
+ #
93
+ # When stress mode is enabled, the GC is invoked at every GC opportunity: all
94
+ # memory and object allocations.
95
+ #
96
+ # Enabling stress mode will degrade performance, it is only for debugging.
97
+ #
98
+ # flag can be true, false, or an integer bit-ORed following flags.
99
+ # 0x01:: no major GC
100
+ # 0x02:: no immediate sweep
101
+ # 0x04:: full mark after malloc/calloc/realloc
102
+ #
103
+ def self.stress=: (Integer | TrueClass | FalseClass flag) -> (Integer | TrueClass | FalseClass)
104
+
105
+ def self.compact: () -> ::Hash[:considered | :moved, Hash[Symbol | Integer, Integer]]
106
+
107
+ # Verify compaction reference consistency.
108
+ #
109
+ # This method is implementation specific. During compaction, objects that were
110
+ # moved are replaced with T_MOVED objects. No object should have a reference to
111
+ # a T_MOVED object after compaction.
112
+ #
113
+ # This function doubles the heap to ensure room to move all objects, compacts
114
+ # the heap to make sure everything moves, updates all references, then performs
115
+ # a full GC. If any object contains a reference to a T_MOVED object, that
116
+ # object should be pushed on the mark stack, and will make a SEGV.
117
+ #
118
+ def self.verify_compaction_references: () -> ::Hash[:considered | :moved, Hash[Symbol | Integer, Integer]]
119
+
120
+ # Verify internal consistency.
121
+ #
122
+ # This method is implementation specific. Now this method checks generational
123
+ # consistency if RGenGC is supported.
124
+ #
125
+ def self.verify_internal_consistency: () -> nil
126
+
127
+ def self.verify_transient_heap_internal_consistency: () -> nil
128
+
129
+ # Returns information about the most recent garbage collection.
130
+ #
131
+ def self.latest_gc_info: () -> ::Hash[::Symbol, untyped]
132
+ | [K] (?Hash[K, untyped] hash) -> ::Hash[::Symbol | K, untyped]
133
+ | (Symbol key) -> untyped
134
+
135
+ def garbage_collect: (?immediate_sweep: bool immediate_sweep, ?immediate_mark: bool immediate_mark, ?full_mark: bool full_mark) -> nil
136
+ end
137
+
138
+ # internal constants
139
+ #
140
+ #
141
+ GC::INTERNAL_CONSTANTS: Hash[Symbol, Integer]
142
+
143
+ # GC build options
144
+ #
145
+ #
146
+ GC::OPTS: Array[String]
147
+
148
+ # The GC profiler provides access to information on GC runs including time,
149
+ # length and object space size.
150
+ #
151
+ # Example:
152
+ #
153
+ # GC::Profiler.enable
154
+ #
155
+ # require 'rdoc/rdoc'
156
+ #
157
+ # GC::Profiler.report
158
+ #
159
+ # GC::Profiler.disable
160
+ #
161
+ # See also GC.count, GC.malloc_allocated_size and GC.malloc_allocations
162
+ #
163
+ module GC::Profiler
164
+ # Clears the GC profiler data.
165
+ #
166
+ def self.clear: () -> void
167
+
168
+ # Stops the GC profiler.
169
+ #
170
+ def self.disable: () -> void
171
+
172
+ # Starts the GC profiler.
173
+ #
174
+ def self.enable: () -> void
175
+
176
+ # The current status of GC profile mode.
177
+ #
178
+ def self.enabled?: () -> bool
179
+
180
+ # Returns an Array of individual raw profile data Hashes ordered from earliest
181
+ # to latest by `:GC_INVOKE_TIME`.
182
+ #
183
+ # For example:
184
+ #
185
+ # [
186
+ # {
187
+ # :GC_TIME=>1.3000000000000858e-05,
188
+ # :GC_INVOKE_TIME=>0.010634999999999999,
189
+ # :HEAP_USE_SIZE=>289640,
190
+ # :HEAP_TOTAL_SIZE=>588960,
191
+ # :HEAP_TOTAL_OBJECTS=>14724,
192
+ # :GC_IS_MARKED=>false
193
+ # },
194
+ # # ...
195
+ # ]
196
+ #
197
+ # The keys mean:
198
+ #
199
+ # `:GC_TIME`
200
+ # : Time elapsed in seconds for this GC run
201
+ # `:GC_INVOKE_TIME`
202
+ # : Time elapsed in seconds from startup to when the GC was invoked
203
+ # `:HEAP_USE_SIZE`
204
+ # : Total bytes of heap used
205
+ # `:HEAP_TOTAL_SIZE`
206
+ # : Total size of heap in bytes
207
+ # `:HEAP_TOTAL_OBJECTS`
208
+ # : Total number of objects
209
+ # `:GC_IS_MARKED`
210
+ # : Returns `true` if the GC is in mark phase
211
+ #
212
+ #
213
+ # If ruby was built with `GC_PROFILE_MORE_DETAIL`, you will also have access to
214
+ # the following hash keys:
215
+ #
216
+ # `:GC_MARK_TIME`
217
+ # `:GC_SWEEP_TIME`
218
+ # `:ALLOCATE_INCREASE`
219
+ # `:ALLOCATE_LIMIT`
220
+ # `:HEAP_USE_PAGES`
221
+ # `:HEAP_LIVE_OBJECTS`
222
+ # `:HEAP_FREE_OBJECTS`
223
+ # `:HAVE_FINALIZE`
224
+ # :
225
+ #
226
+ def self.raw_data: () -> ::Array[::Hash[Symbol, untyped]]
227
+
228
+ # Writes the GC::Profiler.result to `$stdout` or the given IO object.
229
+ #
230
+ def self.report: (?IO io) -> void
231
+
232
+ # Returns a profile data report such as:
233
+ #
234
+ # GC 1 invokes.
235
+ # Index Invoke Time(sec) Use Size(byte) Total Size(byte) Total Object GC time(ms)
236
+ # 1 0.012 159240 212940 10647 0.00000000000001530000
237
+ #
238
+ def self.result: () -> String
239
+
240
+ # The total time used for garbage collection in seconds
241
+ #
242
+ def self.total_time: () -> Float
243
+ end
@@ -0,0 +1,1029 @@
1
+ # A Hash is a dictionary-like collection of unique keys and their values. Also
2
+ # called associative arrays, they are similar to Arrays, but where an Array uses
3
+ # integers as its index, a Hash allows you to use any object type.
4
+ #
5
+ # Hashes enumerate their values in the order that the corresponding keys were
6
+ # inserted.
7
+ #
8
+ # A Hash can be easily created by using its implicit form:
9
+ #
10
+ # grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
11
+ #
12
+ # Hashes allow an alternate syntax for keys that are symbols. Instead of
13
+ #
14
+ # options = { :font_size => 10, :font_family => "Arial" }
15
+ #
16
+ # You could write it as:
17
+ #
18
+ # options = { font_size: 10, font_family: "Arial" }
19
+ #
20
+ # Each named key is a symbol you can access in hash:
21
+ #
22
+ # options[:font_size] # => 10
23
+ #
24
+ # A Hash can also be created through its ::new method:
25
+ #
26
+ # grades = Hash.new
27
+ # grades["Dorothy Doe"] = 9
28
+ #
29
+ # Hashes have a *default value* that is returned when accessing keys that do not
30
+ # exist in the hash. If no default is set `nil` is used. You can set the default
31
+ # value by sending it as an argument to Hash.new:
32
+ #
33
+ # grades = Hash.new(0)
34
+ #
35
+ # Or by using the #default= method:
36
+ #
37
+ # grades = {"Timmy Doe" => 8}
38
+ # grades.default = 0
39
+ #
40
+ # Accessing a value in a Hash requires using its key:
41
+ #
42
+ # puts grades["Jane Doe"] # => 0
43
+ #
44
+ # ### Common Uses
45
+ #
46
+ # Hashes are an easy way to represent data structures, such as
47
+ #
48
+ # books = {}
49
+ # books[:matz] = "The Ruby Programming Language"
50
+ # books[:black] = "The Well-Grounded Rubyist"
51
+ #
52
+ # Hashes are also commonly used as a way to have named parameters in functions.
53
+ # Note that no brackets are used below. If a hash is the last argument on a
54
+ # method call, no braces are needed, thus creating a really clean interface:
55
+ #
56
+ # Person.create(name: "John Doe", age: 27)
57
+ #
58
+ # def self.create(params)
59
+ # @name = params[:name]
60
+ # @age = params[:age]
61
+ # end
62
+ #
63
+ # ### Hash Keys
64
+ #
65
+ # Two objects refer to the same hash key when their `hash` value is identical
66
+ # and the two objects are `eql?` to each other.
67
+ #
68
+ # A user-defined class may be used as a hash key if the `hash` and `eql?`
69
+ # methods are overridden to provide meaningful behavior. By default, separate
70
+ # instances refer to separate hash keys.
71
+ #
72
+ # A typical implementation of `hash` is based on the object's data while `eql?`
73
+ # is usually aliased to the overridden `==` method:
74
+ #
75
+ # class Book
76
+ # attr_reader :author, :title
77
+ #
78
+ # def initialize(author, title)
79
+ # @author = author
80
+ # @title = title
81
+ # end
82
+ #
83
+ # def ==(other)
84
+ # self.class === other and
85
+ # other.author == @author and
86
+ # other.title == @title
87
+ # end
88
+ #
89
+ # alias eql? ==
90
+ #
91
+ # def hash
92
+ # @author.hash ^ @title.hash # XOR
93
+ # end
94
+ # end
95
+ #
96
+ # book1 = Book.new 'matz', 'Ruby in a Nutshell'
97
+ # book2 = Book.new 'matz', 'Ruby in a Nutshell'
98
+ #
99
+ # reviews = {}
100
+ #
101
+ # reviews[book1] = 'Great reference!'
102
+ # reviews[book2] = 'Nice and compact!'
103
+ #
104
+ # reviews.length #=> 1
105
+ #
106
+ # See also Object#hash and Object#eql?
107
+ #
108
+ class Hash[unchecked out K, unchecked out V] < Object
109
+ include Enumerable[[K, V], Hash[K, V]]
110
+
111
+ # Creates a new hash populated with the given objects.
112
+ #
113
+ # Similar to the literal `{ *key* => *value*, ... }`. In the first form, keys
114
+ # and values occur in pairs, so there must be an even number of arguments.
115
+ #
116
+ # The second and third form take a single argument which is either an array of
117
+ # key-value pairs or an object convertible to a hash.
118
+ #
119
+ # Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}
120
+ # Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200}
121
+ # Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200}
122
+ #
123
+ def self.[]: [U, V] (_ToHash[U, V]) -> ::Hash[U, V]
124
+ | [U, V] (Array[[ U, V ]]) -> ::Hash[U, V]
125
+ | (*untyped) -> ::Hash[untyped, untyped]
126
+
127
+ # Try to convert *obj* into a hash, using to_hash method. Returns converted hash
128
+ # or nil if *obj* cannot be converted for any reason.
129
+ #
130
+ # Hash.try_convert({1=>2}) # => {1=>2}
131
+ # Hash.try_convert("1=>2") # => nil
132
+ #
133
+ def self.try_convert: [U, V] (_ToHash[U, V]) -> ::Hash[U, V]
134
+ | (untyped) -> (::Hash[untyped, untyped] | nil)
135
+
136
+ public
137
+
138
+ # Returns `true` if *hash* is subset of *other*.
139
+ #
140
+ # h1 = {a:1, b:2}
141
+ # h2 = {a:1, b:2, c:3}
142
+ # h1 < h2 #=> true
143
+ # h2 < h1 #=> false
144
+ # h1 < h1 #=> false
145
+ #
146
+ def <: (::Hash[K, V]) -> bool
147
+
148
+ # Returns `true` if *hash* is subset of *other* or equals to *other*.
149
+ #
150
+ # h1 = {a:1, b:2}
151
+ # h2 = {a:1, b:2, c:3}
152
+ # h1 <= h2 #=> true
153
+ # h2 <= h1 #=> false
154
+ # h1 <= h1 #=> true
155
+ #
156
+ def <=: (::Hash[K, V]) -> bool
157
+
158
+ # Equality---Two hashes are equal if they each contain the same number of keys
159
+ # and if each key-value pair is equal to (according to Object#==) the
160
+ # corresponding elements in the other hash.
161
+ #
162
+ # h1 = { "a" => 1, "c" => 2 }
163
+ # h2 = { 7 => 35, "c" => 2, "a" => 1 }
164
+ # h3 = { "a" => 1, "c" => 2, 7 => 35 }
165
+ # h4 = { "a" => 1, "d" => 2, "f" => 35 }
166
+ # h1 == h2 #=> false
167
+ # h2 == h3 #=> true
168
+ # h3 == h4 #=> false
169
+ #
170
+ # The orders of each hashes are not compared.
171
+ #
172
+ # h1 = { "a" => 1, "c" => 2 }
173
+ # h2 = { "c" => 2, "a" => 1 }
174
+ # h1 == h2 #=> true
175
+ #
176
+ def ==: (untyped other) -> bool
177
+
178
+ # Returns `true` if *other* is subset of *hash*.
179
+ #
180
+ # h1 = {a:1, b:2}
181
+ # h2 = {a:1, b:2, c:3}
182
+ # h1 > h2 #=> false
183
+ # h2 > h1 #=> true
184
+ # h1 > h1 #=> false
185
+ #
186
+ def >: (::Hash[K, V]) -> bool
187
+
188
+ # Returns `true` if *other* is subset of *hash* or equals to *hash*.
189
+ #
190
+ # h1 = {a:1, b:2}
191
+ # h2 = {a:1, b:2, c:3}
192
+ # h1 >= h2 #=> false
193
+ # h2 >= h1 #=> true
194
+ # h1 >= h1 #=> true
195
+ #
196
+ def >=: (::Hash[K, V]) -> bool
197
+
198
+ # Element Reference---Retrieves the *value* object corresponding to the *key*
199
+ # object. If not found, returns the default value (see Hash::new for details).
200
+ #
201
+ # h = { "a" => 100, "b" => 200 }
202
+ # h["a"] #=> 100
203
+ # h["c"] #=> nil
204
+ #
205
+ def []: (K arg0) -> V
206
+
207
+ # ## Element Assignment
208
+ #
209
+ # Associates the value given by `value` with the key given by `key`.
210
+ #
211
+ # h = { "a" => 100, "b" => 200 }
212
+ # h["a"] = 9
213
+ # h["c"] = 4
214
+ # h #=> {"a"=>9, "b"=>200, "c"=>4}
215
+ # h.store("d", 42) #=> 42
216
+ # h #=> {"a"=>9, "b"=>200, "c"=>4, "d"=>42}
217
+ #
218
+ # `key` should not have its value changed while it is in use as a key (an
219
+ # `unfrozen String` passed as a key will be duplicated and frozen).
220
+ #
221
+ # a = "a"
222
+ # b = "b".freeze
223
+ # h = { a => 100, b => 200 }
224
+ # h.key(100).equal? a #=> false
225
+ # h.key(200).equal? b #=> true
226
+ #
227
+ def []=: (K arg0, V arg1) -> V
228
+
229
+ # See also Enumerable#any?
230
+ #
231
+ def any?: () -> bool
232
+ | (untyped pattern) -> bool
233
+ | () { (K, V) -> bool } -> bool
234
+
235
+ # Searches through the hash comparing *obj* with the key using `==`. Returns the
236
+ # key-value pair (two elements array) or `nil` if no match is found. See
237
+ # Array#assoc.
238
+ #
239
+ # h = {"colors" => ["red", "blue", "green"],
240
+ # "letters" => ["a", "b", "c" ]}
241
+ # h.assoc("letters") #=> ["letters", ["a", "b", "c"]]
242
+ # h.assoc("foo") #=> nil
243
+ #
244
+ def assoc: (K arg0) -> [K, V]?
245
+
246
+ # Removes all key-value pairs from *hsh*.
247
+ #
248
+ # h = { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200}
249
+ # h.clear #=> {}
250
+ #
251
+ def clear: () -> self
252
+
253
+ # Returns a new hash with the nil values/key pairs removed
254
+ #
255
+ # h = { a: 1, b: false, c: nil }
256
+ # h.compact #=> { a: 1, b: false }
257
+ # h #=> { a: 1, b: false, c: nil }
258
+ #
259
+ def compact: () -> self
260
+
261
+ # Removes all nil values from the hash. Returns nil if no changes were made,
262
+ # otherwise returns the hash.
263
+ #
264
+ # h = { a: 1, b: false, c: nil }
265
+ # h.compact! #=> { a: 1, b: false }
266
+ #
267
+ def compact!: () -> self?
268
+
269
+ # Makes *hsh* compare its keys by their identity, i.e. it will consider exact
270
+ # same objects as same keys.
271
+ #
272
+ # h1 = { "a" => 100, "b" => 200, :c => "c" }
273
+ # h1["a"] #=> 100
274
+ # h1.compare_by_identity
275
+ # h1.compare_by_identity? #=> true
276
+ # h1["a".dup] #=> nil # different objects.
277
+ # h1[:c] #=> "c" # same symbols are all same.
278
+ #
279
+ def compare_by_identity: () -> self
280
+
281
+ # Returns `true` if *hsh* will compare its keys by their identity. Also see
282
+ # Hash#compare_by_identity.
283
+ #
284
+ def compare_by_identity?: () -> bool
285
+
286
+ def deconstruct_keys: (Array[K] | nil) -> self
287
+
288
+ # Returns the default value, the value that would be returned by *[hsh](key)* if
289
+ # *key* did not exist in *hsh*. See also Hash::new and Hash#default=.
290
+ #
291
+ # h = Hash.new #=> {}
292
+ # h.default #=> nil
293
+ # h.default(2) #=> nil
294
+ #
295
+ # h = Hash.new("cat") #=> {}
296
+ # h.default #=> "cat"
297
+ # h.default(2) #=> "cat"
298
+ #
299
+ # h = Hash.new {|h,k| h[k] = k.to_i*10} #=> {}
300
+ # h.default #=> nil
301
+ # h.default(2) #=> 20
302
+ #
303
+ def default: (?K arg0) -> V?
304
+
305
+ # Sets the default value, the value returned for a key that does not exist in
306
+ # the hash. It is not possible to set the default to a Proc that will be
307
+ # executed on each key lookup.
308
+ #
309
+ # h = { "a" => 100, "b" => 200 }
310
+ # h.default = "Go fish"
311
+ # h["a"] #=> 100
312
+ # h["z"] #=> "Go fish"
313
+ # # This doesn't do what you might hope...
314
+ # h.default = proc do |hash, key|
315
+ # hash[key] = key + key
316
+ # end
317
+ # h[2] #=> #<Proc:0x401b3948@-:6>
318
+ # h["cat"] #=> #<Proc:0x401b3948@-:6>
319
+ #
320
+ def default=: (V arg0) -> V
321
+
322
+ # If Hash::new was invoked with a block, return that block, otherwise return
323
+ # `nil`.
324
+ #
325
+ # h = Hash.new {|h,k| h[k] = k*k } #=> {}
326
+ # p = h.default_proc #=> #<Proc:0x401b3d08@-:1>
327
+ # a = [] #=> []
328
+ # p.call(a, 2)
329
+ # a #=> [nil, nil, 4]
330
+ #
331
+ def default_proc: () -> (Proc | nil)
332
+
333
+ # Sets the default proc to be executed on each failed key lookup.
334
+ #
335
+ # h.default_proc = proc do |hash, key|
336
+ # hash[key] = key + key
337
+ # end
338
+ # h[2] #=> 4
339
+ # h["cat"] #=> "catcat"
340
+ #
341
+ def default_proc=: (Proc | _ToProc | nil) -> (Proc | _ToProc | nil)
342
+
343
+ # Deletes the key-value pair and returns the value from *hsh* whose key is equal
344
+ # to *key*. If the key is not found, it returns *nil*. If the optional code
345
+ # block is given and the key is not found, pass in the key and return the result
346
+ # of *block*.
347
+ #
348
+ # h = { "a" => 100, "b" => 200 }
349
+ # h.delete("a") #=> 100
350
+ # h.delete("z") #=> nil
351
+ # h.delete("z") { |el| "#{el} not found" } #=> "z not found"
352
+ #
353
+ def delete: (K arg0) -> V?
354
+ | [U] (K arg0) { (K arg0) -> U } -> (U | V)
355
+
356
+ # Deletes every key-value pair from *hsh* for which *block* evaluates to `true`.
357
+ #
358
+ # If no block is given, an enumerator is returned instead.
359
+ #
360
+ # h = { "a" => 100, "b" => 200, "c" => 300 }
361
+ # h.delete_if {|key, value| key >= "b" } #=> {"a"=>100}
362
+ #
363
+ def delete_if: () { (K arg0, V arg1) -> bool } -> self
364
+ | () -> ::Enumerator[[ K, V ], self]
365
+
366
+ # Extracts the nested value specified by the sequence of *key* objects by
367
+ # calling `dig` at each step, returning `nil` if any intermediate step is `nil`.
368
+ #
369
+ # h = { foo: {bar: {baz: 1}}}
370
+ #
371
+ # h.dig(:foo, :bar, :baz) #=> 1
372
+ # h.dig(:foo, :zot, :xyz) #=> nil
373
+ #
374
+ # g = { foo: [10, 11, 12] }
375
+ # g.dig(:foo, 1) #=> 11
376
+ # g.dig(:foo, 1, 0) #=> TypeError: Integer does not have #dig method
377
+ # g.dig(:foo, :bar) #=> TypeError: no implicit conversion of Symbol into Integer
378
+ #
379
+ def dig: (*untyped) -> untyped
380
+
381
+ # Calls *block* once for each key in *hsh*, passing the key-value pair as
382
+ # parameters.
383
+ #
384
+ # If no block is given, an enumerator is returned instead.
385
+ #
386
+ # h = { "a" => 100, "b" => 200 }
387
+ # h.each {|key, value| puts "#{key} is #{value}" }
388
+ #
389
+ # *produces:*
390
+ #
391
+ # a is 100
392
+ # b is 200
393
+ #
394
+ def each: () { ([ K, V ] arg0) -> untyped } -> self
395
+ | () -> ::Enumerator[[ K, V ], self]
396
+
397
+ # Calls *block* once for each key in *hsh*, passing the key as a parameter.
398
+ #
399
+ # If no block is given, an enumerator is returned instead.
400
+ #
401
+ # h = { "a" => 100, "b" => 200 }
402
+ # h.each_key {|key| puts key }
403
+ #
404
+ # *produces:*
405
+ #
406
+ # a
407
+ # b
408
+ #
409
+ def each_key: () { (K arg0) -> untyped } -> ::Hash[K, V]
410
+ | () -> ::Enumerator[K, self]
411
+
412
+ # Calls *block* once for each key in *hsh*, passing the key-value pair as
413
+ # parameters.
414
+ #
415
+ # If no block is given, an enumerator is returned instead.
416
+ #
417
+ # h = { "a" => 100, "b" => 200 }
418
+ # h.each {|key, value| puts "#{key} is #{value}" }
419
+ #
420
+ # *produces:*
421
+ #
422
+ # a is 100
423
+ # b is 200
424
+ #
425
+ alias each_pair each
426
+
427
+ # Calls *block* once for each key in *hsh*, passing the value as a parameter.
428
+ #
429
+ # If no block is given, an enumerator is returned instead.
430
+ #
431
+ # h = { "a" => 100, "b" => 200 }
432
+ # h.each_value {|value| puts value }
433
+ #
434
+ # *produces:*
435
+ #
436
+ # 100
437
+ # 200
438
+ #
439
+ def each_value: () { (V arg0) -> untyped } -> self
440
+ | () -> ::Enumerator[V, self]
441
+
442
+ # Returns `true` if *hsh* contains no key-value pairs.
443
+ #
444
+ # {}.empty? #=> true
445
+ #
446
+ def empty?: () -> bool
447
+
448
+ # Returns `true` if *hash* and *other* are both hashes with the same content.
449
+ # The orders of each hashes are not compared.
450
+ #
451
+ def eql?: (untyped) -> bool
452
+
453
+ # Returns a value from the hash for the given key. If the key can't be found,
454
+ # there are several options: With no other arguments, it will raise a KeyError
455
+ # exception; if *default* is given, then that will be returned; if the optional
456
+ # code block is specified, then that will be run and its result returned.
457
+ #
458
+ # h = { "a" => 100, "b" => 200 }
459
+ # h.fetch("a") #=> 100
460
+ # h.fetch("z", "go fish") #=> "go fish"
461
+ # h.fetch("z") { |el| "go fish, #{el}"} #=> "go fish, z"
462
+ #
463
+ # The following example shows that an exception is raised if the key is not
464
+ # found and a default value is not supplied.
465
+ #
466
+ # h = { "a" => 100, "b" => 200 }
467
+ # h.fetch("z")
468
+ #
469
+ # *produces:*
470
+ #
471
+ # prog.rb:2:in `fetch': key not found (KeyError)
472
+ # from prog.rb:2
473
+ #
474
+ def fetch: (K arg0) -> V
475
+ | [X] (K arg0, X arg1) -> (V | X)
476
+ | [X] (K arg0) { (K arg0) -> X } -> (V | X)
477
+
478
+ # Returns an array containing the values associated with the given keys but also
479
+ # raises KeyError when one of keys can't be found. Also see Hash#values_at and
480
+ # Hash#fetch.
481
+ #
482
+ # h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" }
483
+ #
484
+ # h.fetch_values("cow", "cat") #=> ["bovine", "feline"]
485
+ # h.fetch_values("cow", "bird") # raises KeyError
486
+ # h.fetch_values("cow", "bird") { |k| k.upcase } #=> ["bovine", "BIRD"]
487
+ #
488
+ def fetch_values: (*K) -> Array[V]
489
+ | [X] (*K) { (K) -> X } -> (V | X)
490
+
491
+ # Returns a new hash consisting of entries for which the block returns true.
492
+ #
493
+ # If no block is given, an enumerator is returned instead.
494
+ #
495
+ # h = { "a" => 100, "b" => 200, "c" => 300 }
496
+ # h.select {|k,v| k > "a"} #=> {"b" => 200, "c" => 300}
497
+ # h.select {|k,v| v < 200} #=> {"a" => 100}
498
+ #
499
+ # Hash#filter is an alias for Hash#select.
500
+ #
501
+ def filter: () { (K arg0, V arg1) -> bool } -> self
502
+ | () -> ::Enumerator[[ K, V ], self]
503
+
504
+ # Equivalent to Hash#keep_if, but returns `nil` if no changes were made.
505
+ #
506
+ # Hash#filter! is an alias for Hash#select!.
507
+ #
508
+ def filter!: () { (K arg0, V arg1) -> bool } -> self?
509
+ | () -> ::Enumerator[[ K, V ], self?]
510
+
511
+ # Returns a new array that is a one-dimensional flattening of this hash. That
512
+ # is, for every key or value that is an array, extract its elements into the new
513
+ # array. Unlike Array#flatten, this method does not flatten recursively by
514
+ # default. The optional *level* argument determines the level of recursion to
515
+ # flatten.
516
+ #
517
+ # a = {1=> "one", 2 => [2,"two"], 3 => "three"}
518
+ # a.flatten # => [1, "one", 2, [2, "two"], 3, "three"]
519
+ # a.flatten(2) # => [1, "one", 2, 2, "two", 3, "three"]
520
+ #
521
+ def flatten: () -> ::Array[K | V]
522
+ | (1 level) -> ::Array[K | V]
523
+ | (Integer level) -> Array[untyped]
524
+
525
+ # Returns `true` if the given key is present in *hsh*.
526
+ #
527
+ # h = { "a" => 100, "b" => 200 }
528
+ # h.has_key?("a") #=> true
529
+ # h.has_key?("z") #=> false
530
+ #
531
+ # Note that #include? and #member? do not test member equality using `==` as do
532
+ # other Enumerables.
533
+ #
534
+ # See also Enumerable#include?
535
+ #
536
+ def has_key?: (K arg0) -> bool
537
+
538
+ # Returns `true` if the given value is present for some key in *hsh*.
539
+ #
540
+ # h = { "a" => 100, "b" => 200 }
541
+ # h.value?(100) #=> true
542
+ # h.value?(999) #=> false
543
+ #
544
+ def has_value?: (V arg0) -> bool
545
+
546
+ # Compute a hash-code for this hash. Two hashes with the same content will have
547
+ # the same hash code (and will compare using `eql?`).
548
+ #
549
+ # See also Object#hash.
550
+ #
551
+ def hash: () -> Integer
552
+
553
+ # Returns `true` if the given key is present in *hsh*.
554
+ #
555
+ # h = { "a" => 100, "b" => 200 }
556
+ # h.has_key?("a") #=> true
557
+ # h.has_key?("z") #=> false
558
+ #
559
+ # Note that #include? and #member? do not test member equality using `==` as do
560
+ # other Enumerables.
561
+ #
562
+ # See also Enumerable#include?
563
+ #
564
+ alias include? has_key?
565
+
566
+ def index: (V) -> K?
567
+
568
+ # Return the contents of this hash as a string.
569
+ #
570
+ # h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }
571
+ # h.to_s #=> "{\"c\"=>300, \"a\"=>100, \"d\"=>400}"
572
+ #
573
+ def inspect: () -> String
574
+
575
+ # Returns a new hash created by using *hsh*'s values as keys, and the keys as
576
+ # values. If a key with the same value already exists in the *hsh*, then the
577
+ # last one defined will be used, the earlier value(s) will be discarded.
578
+ #
579
+ # h = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 }
580
+ # h.invert #=> {0=>"a", 100=>"m", 200=>"d", 300=>"y"}
581
+ #
582
+ # If there is no key with the same value, Hash#invert is involutive.
583
+ #
584
+ # h = { a: 1, b: 3, c: 4 }
585
+ # h.invert.invert == h #=> true
586
+ #
587
+ # The condition, no key with the same value, can be tested by comparing the size
588
+ # of inverted hash.
589
+ #
590
+ # # no key with the same value
591
+ # h = { a: 1, b: 3, c: 4 }
592
+ # h.size == h.invert.size #=> true
593
+ #
594
+ # # two (or more) keys has the same value
595
+ # h = { a: 1, b: 3, c: 1 }
596
+ # h.size == h.invert.size #=> false
597
+ #
598
+ def invert: () -> ::Hash[V, K]
599
+
600
+ # Deletes every key-value pair from *hsh* for which *block* evaluates to
601
+ # `false`.
602
+ #
603
+ # If no block is given, an enumerator is returned instead.
604
+ #
605
+ # See also Hash#select!.
606
+ #
607
+ def keep_if: () { (K, V) -> bool } -> self
608
+ | () -> ::Enumerator[[ K, V ], self]
609
+
610
+ # Returns the key of an occurrence of a given value. If the value is not found,
611
+ # returns `nil`.
612
+ #
613
+ # h = { "a" => 100, "b" => 200, "c" => 300, "d" => 300 }
614
+ # h.key(200) #=> "b"
615
+ # h.key(300) #=> "c"
616
+ # h.key(999) #=> nil
617
+ #
618
+ alias key index
619
+
620
+ # Returns `true` if the given key is present in *hsh*.
621
+ #
622
+ # h = { "a" => 100, "b" => 200 }
623
+ # h.has_key?("a") #=> true
624
+ # h.has_key?("z") #=> false
625
+ #
626
+ # Note that #include? and #member? do not test member equality using `==` as do
627
+ # other Enumerables.
628
+ #
629
+ # See also Enumerable#include?
630
+ #
631
+ alias key? has_key?
632
+
633
+ # Returns a new array populated with the keys from this hash. See also
634
+ # Hash#values.
635
+ #
636
+ # h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 }
637
+ # h.keys #=> ["a", "b", "c", "d"]
638
+ #
639
+ def keys: () -> ::Array[K]
640
+
641
+ # Returns the number of key-value pairs in the hash.
642
+ #
643
+ # h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 }
644
+ # h.size #=> 4
645
+ # h.delete("a") #=> 200
646
+ # h.size #=> 3
647
+ # h.length #=> 3
648
+ #
649
+ # Hash#length is an alias for Hash#size.
650
+ #
651
+ def length: () -> Integer
652
+
653
+ # Returns `true` if the given key is present in *hsh*.
654
+ #
655
+ # h = { "a" => 100, "b" => 200 }
656
+ # h.has_key?("a") #=> true
657
+ # h.has_key?("z") #=> false
658
+ #
659
+ # Note that #include? and #member? do not test member equality using `==` as do
660
+ # other Enumerables.
661
+ #
662
+ # See also Enumerable#include?
663
+ #
664
+ alias member? has_key?
665
+
666
+ # Returns a new hash that combines the contents of the receiver and the contents
667
+ # of the given hashes.
668
+ #
669
+ # If no block is given, entries with duplicate keys are overwritten with the
670
+ # values from each `other_hash` successively, otherwise the value for each
671
+ # duplicate key is determined by calling the block with the key, its value in
672
+ # the receiver and its value in each `other_hash`.
673
+ #
674
+ # When called without any argument, returns a copy of the receiver.
675
+ #
676
+ # h1 = { "a" => 100, "b" => 200 }
677
+ # h2 = { "b" => 246, "c" => 300 }
678
+ # h3 = { "b" => 357, "d" => 400 }
679
+ # h1.merge #=> {"a"=>100, "b"=>200}
680
+ # h1.merge(h2) #=> {"a"=>100, "b"=>246, "c"=>300}
681
+ # h1.merge(h2, h3) #=> {"a"=>100, "b"=>357, "c"=>300, "d"=>400}
682
+ # h1.merge(h2) {|key, oldval, newval| newval - oldval}
683
+ # #=> {"a"=>100, "b"=>46, "c"=>300}
684
+ # h1.merge(h2, h3) {|key, oldval, newval| newval - oldval}
685
+ # #=> {"a"=>100, "b"=>311, "c"=>300, "d"=>400}
686
+ # h1 #=> {"a"=>100, "b"=>200}
687
+ #
688
+ def merge: [A, B] (*::Hash[A, B] other_hashes) -> ::Hash[A | K, B | V]
689
+ | [A, B, C] (*::Hash[A, B] other_hashes) { (K key, V oldval, B newval) -> (C) } -> ::Hash[A | K, B | V | C]
690
+
691
+ # Adds the contents of the given hashes to the receiver.
692
+ #
693
+ # If no block is given, entries with duplicate keys are overwritten with the
694
+ # values from each `other_hash` successively, otherwise the value for each
695
+ # duplicate key is determined by calling the block with the key, its value in
696
+ # the receiver and its value in each `other_hash`.
697
+ #
698
+ # h1 = { "a" => 100, "b" => 200 }
699
+ # h1.merge! #=> {"a"=>100, "b"=>200}
700
+ # h1 #=> {"a"=>100, "b"=>200}
701
+ #
702
+ # h1 = { "a" => 100, "b" => 200 }
703
+ # h2 = { "b" => 246, "c" => 300 }
704
+ # h1.merge!(h2) #=> {"a"=>100, "b"=>246, "c"=>300}
705
+ # h1 #=> {"a"=>100, "b"=>246, "c"=>300}
706
+ #
707
+ # h1 = { "a" => 100, "b" => 200 }
708
+ # h2 = { "b" => 246, "c" => 300 }
709
+ # h3 = { "b" => 357, "d" => 400 }
710
+ # h1.merge!(h2, h3)
711
+ # #=> {"a"=>100, "b"=>357, "c"=>300, "d"=>400}
712
+ # h1 #=> {"a"=>100, "b"=>357, "c"=>300, "d"=>400}
713
+ #
714
+ # h1 = { "a" => 100, "b" => 200 }
715
+ # h2 = { "b" => 246, "c" => 300 }
716
+ # h3 = { "b" => 357, "d" => 400 }
717
+ # h1.merge!(h2, h3) {|key, v1, v2| v1 }
718
+ # #=> {"a"=>100, "b"=>200, "c"=>300, "d"=>400}
719
+ # h1 #=> {"a"=>100, "b"=>200, "c"=>300, "d"=>400}
720
+ #
721
+ # Hash#update is an alias for Hash#merge!.
722
+ #
723
+ def merge!: [A, B] (*::Hash[A, B] other_hashes) -> ::Hash[A | K, B | V]
724
+ | [A, B, C] (*::Hash[A, B] other_hashes) { (K key, V oldval, B newval) -> (C) } -> ::Hash[A | K, B | V | C]
725
+
726
+ # Searches through the hash comparing *obj* with the value using `==`. Returns
727
+ # the first key-value pair (two-element array) that matches. See also
728
+ # Array#rassoc.
729
+ #
730
+ # a = {1=> "one", 2 => "two", 3 => "three", "ii" => "two"}
731
+ # a.rassoc("two") #=> [2, "two"]
732
+ # a.rassoc("four") #=> nil
733
+ #
734
+ def rassoc: (V) -> [K, V]?
735
+
736
+ # Rebuilds the hash based on the current hash values for each key. If values of
737
+ # key objects have changed since they were inserted, this method will reindex
738
+ # *hsh*. If Hash#rehash is called while an iterator is traversing the hash, a
739
+ # RuntimeError will be raised in the iterator.
740
+ #
741
+ # a = [ "a", "b" ]
742
+ # c = [ "c", "d" ]
743
+ # h = { a => 100, c => 300 }
744
+ # h[a] #=> 100
745
+ # a[0] = "z"
746
+ # h[a] #=> nil
747
+ # h.rehash #=> {["z", "b"]=>100, ["c", "d"]=>300}
748
+ # h[a] #=> 100
749
+ #
750
+ def rehash: () -> self
751
+
752
+ # Returns a new hash consisting of entries for which the block returns false.
753
+ #
754
+ # If no block is given, an enumerator is returned instead.
755
+ #
756
+ # h = { "a" => 100, "b" => 200, "c" => 300 }
757
+ # h.reject {|k,v| k < "b"} #=> {"b" => 200, "c" => 300}
758
+ # h.reject {|k,v| v > 100} #=> {"a" => 100}
759
+ #
760
+ def reject: () -> ::Enumerator[[ K, V ], self]
761
+ | () { (K arg0, V arg1) -> bool } -> self
762
+
763
+ # Equivalent to Hash#delete_if, but returns `nil` if no changes were made.
764
+ #
765
+ def reject!: () -> ::Enumerator[[ K, V ], self?]
766
+ | () { (K arg0, V arg1) -> bool } -> self?
767
+
768
+ # Replaces the contents of *hsh* with the contents of *other_hash*.
769
+ #
770
+ # h = { "a" => 100, "b" => 200 }
771
+ # h.replace({ "c" => 300, "d" => 400 }) #=> {"c"=>300, "d"=>400}
772
+ #
773
+ def replace: [A, B] (Hash[A, B] | _ToHash[A, B]) -> Hash[A, B]
774
+
775
+ # Returns a new hash consisting of entries for which the block returns true.
776
+ #
777
+ # If no block is given, an enumerator is returned instead.
778
+ #
779
+ # h = { "a" => 100, "b" => 200, "c" => 300 }
780
+ # h.select {|k,v| k > "a"} #=> {"b" => 200, "c" => 300}
781
+ # h.select {|k,v| v < 200} #=> {"a" => 100}
782
+ #
783
+ # Hash#filter is an alias for Hash#select.
784
+ #
785
+ alias select filter
786
+
787
+ # Equivalent to Hash#keep_if, but returns `nil` if no changes were made.
788
+ #
789
+ # Hash#filter! is an alias for Hash#select!.
790
+ #
791
+ alias select! filter!
792
+
793
+ # Removes a key-value pair from *hsh* and returns it as the two-item array `[`
794
+ # *key, value* `]`, or the hash's default value if the hash is empty.
795
+ #
796
+ # h = { 1 => "a", 2 => "b", 3 => "c" }
797
+ # h.shift #=> [1, "a"]
798
+ # h #=> {2=>"b", 3=>"c"}
799
+ #
800
+ def shift: () -> [ K, V ]?
801
+
802
+ # Returns the number of key-value pairs in the hash.
803
+ #
804
+ # h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 }
805
+ # h.size #=> 4
806
+ # h.delete("a") #=> 200
807
+ # h.size #=> 3
808
+ # h.length #=> 3
809
+ #
810
+ # Hash#length is an alias for Hash#size.
811
+ #
812
+ alias size length
813
+
814
+ # Returns a hash containing only the given keys and their values.
815
+ #
816
+ # h = { a: 100, b: 200, c: 300 }
817
+ # h.slice(:a) #=> {:a=>100}
818
+ # h.slice(:b, :c, :d) #=> {:b=>200, :c=>300}
819
+ #
820
+ def slice: (*K) -> self
821
+
822
+ # ## Element Assignment
823
+ #
824
+ # Associates the value given by `value` with the key given by `key`.
825
+ #
826
+ # h = { "a" => 100, "b" => 200 }
827
+ # h["a"] = 9
828
+ # h["c"] = 4
829
+ # h #=> {"a"=>9, "b"=>200, "c"=>4}
830
+ # h.store("d", 42) #=> 42
831
+ # h #=> {"a"=>9, "b"=>200, "c"=>4, "d"=>42}
832
+ #
833
+ # `key` should not have its value changed while it is in use as a key (an
834
+ # `unfrozen String` passed as a key will be duplicated and frozen).
835
+ #
836
+ # a = "a"
837
+ # b = "b".freeze
838
+ # h = { a => 100, b => 200 }
839
+ # h.key(100).equal? a #=> false
840
+ # h.key(200).equal? b #=> true
841
+ #
842
+ alias store []=
843
+
844
+ # Converts *hsh* to a nested array of `[` *key, value* `]` arrays.
845
+ #
846
+ # h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }
847
+ # h.to_a #=> [["c", 300], ["a", 100], ["d", 400]]
848
+ #
849
+ def to_a: () -> ::Array[[ K, V ]]
850
+
851
+ # Returns `self`. If called on a subclass of Hash, converts the receiver to a
852
+ # Hash object.
853
+ #
854
+ # If a block is given, the results of the block on each pair of the receiver
855
+ # will be used as pairs.
856
+ #
857
+ def to_h: () -> Hash[K, V]
858
+ | [A, B] () { (K, V) -> [ A, B ] } -> Hash[A, B]
859
+
860
+ # Returns `self`.
861
+ #
862
+ def to_hash: () -> ::Hash[K, V]
863
+
864
+ # Returns a Proc which maps keys to values.
865
+ #
866
+ # h = {a:1, b:2}
867
+ # hp = h.to_proc
868
+ # hp.call(:a) #=> 1
869
+ # hp.call(:b) #=> 2
870
+ # hp.call(:c) #=> nil
871
+ # [:a, :b, :c].map(&h) #=> [1, 2, nil]
872
+ #
873
+ def to_proc: () -> ^(K) -> V?
874
+
875
+ alias to_s inspect
876
+
877
+ # Returns a new hash with the results of running the block once for every key.
878
+ # This method does not change the values.
879
+ #
880
+ # h = { a: 1, b: 2, c: 3 }
881
+ # h.transform_keys {|k| k.to_s } #=> { "a" => 1, "b" => 2, "c" => 3 }
882
+ # h.transform_keys(&:to_s) #=> { "a" => 1, "b" => 2, "c" => 3 }
883
+ # h.transform_keys.with_index {|k, i| "#{k}.#{i}" }
884
+ # #=> { "a.0" => 1, "b.1" => 2, "c.2" => 3 }
885
+ #
886
+ # If no block is given, an enumerator is returned instead.
887
+ #
888
+ def transform_keys: () -> Enumerator[K, Hash[untyped, V]]
889
+ | [A] () { (K) -> A } -> Hash[A, V]
890
+
891
+ # Invokes the given block once for each key in *hsh*, replacing it with the new
892
+ # key returned by the block, and then returns *hsh*. This method does not change
893
+ # the values.
894
+ #
895
+ # h = { a: 1, b: 2, c: 3 }
896
+ # h.transform_keys! {|k| k.to_s } #=> { "a" => 1, "b" => 2, "c" => 3 }
897
+ # h.transform_keys!(&:to_sym) #=> { a: 1, b: 2, c: 3 }
898
+ # h.transform_keys!.with_index {|k, i| "#{k}.#{i}" }
899
+ # #=> { "a.0" => 1, "b.1" => 2, "c.2" => 3 }
900
+ #
901
+ # If no block is given, an enumerator is returned instead.
902
+ #
903
+ def transform_keys!: () -> Enumerator[K, Hash[untyped, V]]
904
+ | () { (K) -> K } -> Hash[K, V]
905
+
906
+ # Returns a new hash with the results of running the block once for every value.
907
+ # This method does not change the keys.
908
+ #
909
+ # h = { a: 1, b: 2, c: 3 }
910
+ # h.transform_values {|v| v * v + 1 } #=> { a: 2, b: 5, c: 10 }
911
+ # h.transform_values(&:to_s) #=> { a: "1", b: "2", c: "3" }
912
+ # h.transform_values.with_index {|v, i| "#{v}.#{i}" }
913
+ # #=> { a: "1.0", b: "2.1", c: "3.2" }
914
+ #
915
+ # If no block is given, an enumerator is returned instead.
916
+ #
917
+ def transform_values: () -> Enumerator[K, Hash[K, untyped]]
918
+ | [A] () { (V) -> A } -> Hash[K, A]
919
+
920
+ # Invokes the given block once for each value in *hsh*, replacing it with the
921
+ # new value returned by the block, and then returns *hsh*. This method does not
922
+ # change the keys.
923
+ #
924
+ # h = { a: 1, b: 2, c: 3 }
925
+ # h.transform_values! {|v| v * v + 1 } #=> { a: 2, b: 5, c: 10 }
926
+ # h.transform_values!(&:to_s) #=> { a: "2", b: "5", c: "10" }
927
+ # h.transform_values!.with_index {|v, i| "#{v}.#{i}" }
928
+ # #=> { a: "2.0", b: "5.1", c: "10.2" }
929
+ #
930
+ # If no block is given, an enumerator is returned instead.
931
+ #
932
+ def transform_values!: () -> Enumerator[K, Hash[K, untyped]]
933
+ | () { (V) -> V } -> Hash[K, V]
934
+
935
+ # Adds the contents of the given hashes to the receiver.
936
+ #
937
+ # If no block is given, entries with duplicate keys are overwritten with the
938
+ # values from each `other_hash` successively, otherwise the value for each
939
+ # duplicate key is determined by calling the block with the key, its value in
940
+ # the receiver and its value in each `other_hash`.
941
+ #
942
+ # h1 = { "a" => 100, "b" => 200 }
943
+ # h1.merge! #=> {"a"=>100, "b"=>200}
944
+ # h1 #=> {"a"=>100, "b"=>200}
945
+ #
946
+ # h1 = { "a" => 100, "b" => 200 }
947
+ # h2 = { "b" => 246, "c" => 300 }
948
+ # h1.merge!(h2) #=> {"a"=>100, "b"=>246, "c"=>300}
949
+ # h1 #=> {"a"=>100, "b"=>246, "c"=>300}
950
+ #
951
+ # h1 = { "a" => 100, "b" => 200 }
952
+ # h2 = { "b" => 246, "c" => 300 }
953
+ # h3 = { "b" => 357, "d" => 400 }
954
+ # h1.merge!(h2, h3)
955
+ # #=> {"a"=>100, "b"=>357, "c"=>300, "d"=>400}
956
+ # h1 #=> {"a"=>100, "b"=>357, "c"=>300, "d"=>400}
957
+ #
958
+ # h1 = { "a" => 100, "b" => 200 }
959
+ # h2 = { "b" => 246, "c" => 300 }
960
+ # h3 = { "b" => 357, "d" => 400 }
961
+ # h1.merge!(h2, h3) {|key, v1, v2| v1 }
962
+ # #=> {"a"=>100, "b"=>200, "c"=>300, "d"=>400}
963
+ # h1 #=> {"a"=>100, "b"=>200, "c"=>300, "d"=>400}
964
+ #
965
+ # Hash#update is an alias for Hash#merge!.
966
+ #
967
+ alias update merge!
968
+
969
+ # Returns `true` if the given value is present for some key in *hsh*.
970
+ #
971
+ # h = { "a" => 100, "b" => 200 }
972
+ # h.value?(100) #=> true
973
+ # h.value?(999) #=> false
974
+ #
975
+ alias value? has_value?
976
+
977
+ # Returns a new array populated with the values from *hsh*. See also Hash#keys.
978
+ #
979
+ # h = { "a" => 100, "b" => 200, "c" => 300 }
980
+ # h.values #=> [100, 200, 300]
981
+ #
982
+ def values: () -> ::Array[V]
983
+
984
+ # Return an array containing the values associated with the given keys. Also see
985
+ # Hash.select.
986
+ #
987
+ # h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" }
988
+ # h.values_at("cow", "cat") #=> ["bovine", "feline"]
989
+ #
990
+ def values_at: (*K arg0) -> ::Array[V?]
991
+
992
+ private
993
+
994
+ # Returns a new, empty hash. If this hash is subsequently accessed by a key that
995
+ # doesn't correspond to a hash entry, the value returned depends on the style of
996
+ # `new` used to create the hash. In the first form, the access returns `nil`. If
997
+ # *obj* is specified, this single object will be used for all *default values*.
998
+ # If a block is specified, it will be called with the hash object and the key,
999
+ # and should return the default value. It is the block's responsibility to store
1000
+ # the value in the hash if required.
1001
+ #
1002
+ # h = Hash.new("Go Fish")
1003
+ # h["a"] = 100
1004
+ # h["b"] = 200
1005
+ # h["a"] #=> 100
1006
+ # h["c"] #=> "Go Fish"
1007
+ # # The following alters the single default object
1008
+ # h["c"].upcase! #=> "GO FISH"
1009
+ # h["d"] #=> "GO FISH"
1010
+ # h.keys #=> ["a", "b"]
1011
+ #
1012
+ # # While this creates a new default object each time
1013
+ # h = Hash.new { |hash, key| hash[key] = "Go Fish: #{key}" }
1014
+ # h["c"] #=> "Go Fish: c"
1015
+ # h["c"].upcase! #=> "GO FISH: C"
1016
+ # h["d"] #=> "Go Fish: d"
1017
+ # h.keys #=> ["c", "d"]
1018
+ #
1019
+ incompatible def initialize: () -> void
1020
+ | (untyped default) -> void
1021
+ | [A, B] () { (Hash[A, B] hash, A key) -> B } -> void
1022
+
1023
+ # Replaces the contents of *hsh* with the contents of *other_hash*.
1024
+ #
1025
+ # h = { "a" => 100, "b" => 200 }
1026
+ # h.replace({ "c" => 300, "d" => 400 }) #=> {"c"=>300, "d"=>400}
1027
+ #
1028
+ def initialize_copy: (self object) -> self
1029
+ end