rbs 3.0.0.dev.2 → 3.0.0.dev.3
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.
- checksums.yaml +4 -4
- data/.github/workflows/comments.yml +2 -1
- data/.github/workflows/ruby.yml +4 -0
- data/Gemfile.lock +11 -11
- data/Rakefile +2 -2
- data/Steepfile +1 -1
- data/core/array.rbs +573 -423
- data/core/basic_object.rbs +11 -39
- data/core/binding.rbs +1 -1
- data/core/builtin.rbs +8 -0
- data/core/class.rbs +37 -0
- data/core/comparable.rbs +7 -18
- data/core/complex.rbs +2 -2
- data/core/data.rbs +419 -0
- data/core/dir.rbs +52 -104
- data/core/encoding.rbs +22 -181
- data/core/enumerable.rbs +212 -175
- data/core/enumerator/product.rbs +96 -0
- data/core/enumerator.rbs +57 -8
- data/core/errors.rbs +8 -2
- data/core/exception.rbs +41 -0
- data/core/fiber.rbs +95 -12
- data/core/file.rbs +840 -275
- data/core/file_test.rbs +34 -19
- data/core/float.rbs +40 -96
- data/core/gc.rbs +15 -3
- data/core/hash.rbs +113 -175
- data/core/integer.rbs +85 -145
- data/core/io/buffer.rbs +187 -60
- data/core/io/wait.rbs +28 -16
- data/core/io.rbs +1859 -1389
- data/core/kernel.rbs +525 -961
- data/core/match_data.rbs +306 -142
- data/core/math.rbs +506 -234
- data/core/method.rbs +0 -24
- data/core/module.rbs +110 -17
- data/core/nil_class.rbs +2 -0
- data/core/numeric.rbs +76 -144
- data/core/object.rbs +88 -212
- data/core/proc.rbs +17 -5
- data/core/process.rbs +22 -5
- data/core/ractor.rbs +1 -1
- data/core/random.rbs +20 -3
- data/core/range.rbs +91 -89
- data/core/rational.rbs +2 -3
- data/core/rbs/unnamed/argf.rbs +177 -120
- data/core/rbs/unnamed/env_class.rbs +89 -163
- data/core/rbs/unnamed/random.rbs +36 -12
- data/core/refinement.rbs +8 -0
- data/core/regexp.rbs +462 -272
- data/core/ruby_vm.rbs +210 -0
- data/{stdlib/set/0 → core}/set.rbs +43 -47
- data/core/string.rbs +1403 -1332
- data/core/string_io.rbs +191 -107
- data/core/struct.rbs +67 -63
- data/core/symbol.rbs +187 -201
- data/core/thread.rbs +40 -35
- data/core/time.rbs +902 -826
- data/core/trace_point.rbs +55 -6
- data/core/unbound_method.rbs +48 -24
- data/docs/collection.md +4 -0
- data/docs/syntax.md +55 -0
- data/ext/rbs_extension/parser.c +5 -6
- data/lib/rbs/cli.rb +6 -1
- data/lib/rbs/collection/cleaner.rb +8 -1
- data/lib/rbs/collection/config/lockfile.rb +3 -1
- data/lib/rbs/collection/config/lockfile_generator.rb +16 -14
- data/lib/rbs/collection/config.rb +1 -1
- data/lib/rbs/collection/sources/git.rb +9 -2
- data/lib/rbs/collection/sources/local.rb +79 -0
- data/lib/rbs/collection/sources.rb +8 -1
- data/lib/rbs/environment.rb +6 -5
- data/lib/rbs/environment_loader.rb +3 -2
- data/lib/rbs/errors.rb +18 -0
- data/lib/rbs/locator.rb +26 -7
- data/lib/rbs/sorter.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/sig/collection/sources.rbs +32 -3
- data/sig/environment.rbs +2 -3
- data/sig/locator.rbs +14 -2
- data/sig/shims/{abstract_syntax_tree.rbs → _abstract_syntax_tree.rbs} +0 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +16 -13
- data/stdlib/cgi/0/core.rbs +16 -0
- data/stdlib/coverage/0/coverage.rbs +50 -8
- data/stdlib/csv/0/csv.rbs +1 -1
- data/stdlib/date/0/date.rbs +856 -726
- data/stdlib/date/0/date_time.rbs +83 -210
- data/stdlib/erb/0/erb.rbs +13 -36
- data/stdlib/etc/0/etc.rbs +127 -20
- data/stdlib/fileutils/0/fileutils.rbs +1290 -381
- data/stdlib/logger/0/logger.rbs +466 -316
- data/stdlib/net-http/0/net-http.rbs +2211 -534
- data/stdlib/nkf/0/nkf.rbs +5 -5
- data/stdlib/objspace/0/objspace.rbs +31 -14
- data/stdlib/openssl/0/openssl.rbs +11 -7
- data/stdlib/optparse/0/optparse.rbs +20 -17
- data/stdlib/pathname/0/pathname.rbs +21 -4
- data/stdlib/pstore/0/pstore.rbs +378 -154
- data/stdlib/pty/0/pty.rbs +24 -8
- data/stdlib/ripper/0/ripper.rbs +1650 -0
- data/stdlib/socket/0/addrinfo.rbs +9 -15
- data/stdlib/socket/0/socket.rbs +36 -3
- data/stdlib/strscan/0/string_scanner.rbs +7 -5
- data/stdlib/tempfile/0/tempfile.rbs +104 -44
- data/stdlib/time/0/time.rbs +2 -2
- data/stdlib/uri/0/file.rbs +5 -0
- data/stdlib/uri/0/generic.rbs +2 -2
- data/stdlib/yaml/0/yaml.rbs +2 -2
- data/stdlib/zlib/0/zlib.rbs +1 -1
- metadata +8 -6
- data/core/deprecated.rbs +0 -9
- data/sig/shims/ripper.rbs +0 -8
data/core/basic_object.rbs
CHANGED
|
@@ -49,45 +49,17 @@
|
|
|
49
49
|
#
|
|
50
50
|
# These are the methods defined for BasicObject:
|
|
51
51
|
#
|
|
52
|
-
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
#
|
|
56
|
-
# :
|
|
57
|
-
#
|
|
58
|
-
#
|
|
59
|
-
# :
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
# [__id__](#method-i-__id__)
|
|
65
|
-
# : Returns the integer object identifier for `self`.
|
|
66
|
-
#
|
|
67
|
-
# [__send__](#method-i-__send__)
|
|
68
|
-
# : Calls the method identified by the given symbol.
|
|
69
|
-
#
|
|
70
|
-
# #equal?
|
|
71
|
-
# : Returns whether `self` and the given object are the same object.
|
|
72
|
-
#
|
|
73
|
-
# #instance_eval
|
|
74
|
-
# : Evaluates the given string or block in the context of `self`.
|
|
75
|
-
#
|
|
76
|
-
# #instance_exec
|
|
77
|
-
# : Executes the given block in the context of `self`, passing the given
|
|
78
|
-
# arguments.
|
|
79
|
-
#
|
|
80
|
-
# #method_missing
|
|
81
|
-
# : Method called when an undefined method is called on `self`.
|
|
82
|
-
#
|
|
83
|
-
# #singleton_method_added
|
|
84
|
-
# : Method called when a singleton method is added to `self`.
|
|
85
|
-
#
|
|
86
|
-
# #singleton_method_removed
|
|
87
|
-
# : Method called when a singleton method is added removed from `self`.
|
|
88
|
-
#
|
|
89
|
-
# #singleton_method_undefined
|
|
90
|
-
# : Method called when a singleton method is undefined in `self`.
|
|
52
|
+
# * ::new: Returns a new BasicObject instance.
|
|
53
|
+
# * #!: Returns the boolean negation of `self`: `true` or `false`.
|
|
54
|
+
# * #!=: Returns whether `self` and the given object are *not* equal.
|
|
55
|
+
# * #==: Returns whether `self` and the given object are equivalent.
|
|
56
|
+
# * #__id__: Returns the integer object identifier for `self`.
|
|
57
|
+
# * #__send__: Calls the method identified by the given symbol.
|
|
58
|
+
# * #equal?: Returns whether `self` and the given object are the same object.
|
|
59
|
+
# * #instance_eval: Evaluates the given string or block in the context of
|
|
60
|
+
# `self`.
|
|
61
|
+
# * #instance_exec: Executes the given block in the context of `self`, passing
|
|
62
|
+
# the given arguments.
|
|
91
63
|
#
|
|
92
64
|
class BasicObject
|
|
93
65
|
# <!--
|
data/core/binding.rbs
CHANGED
data/core/builtin.rbs
CHANGED
|
@@ -14,6 +14,10 @@ interface _ToS
|
|
|
14
14
|
def to_s: () -> String
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
+
interface _ToF
|
|
18
|
+
def to_f: () -> Float
|
|
19
|
+
end
|
|
20
|
+
|
|
17
21
|
interface _ToStr
|
|
18
22
|
def to_str: () -> String
|
|
19
23
|
end
|
|
@@ -34,6 +38,10 @@ interface _Each[out A]
|
|
|
34
38
|
def each: () { (A) -> void } -> void
|
|
35
39
|
end
|
|
36
40
|
|
|
41
|
+
interface _EachEntry[out A]
|
|
42
|
+
def each_entry: () { (A) -> void } -> self
|
|
43
|
+
end
|
|
44
|
+
|
|
37
45
|
interface _Reader
|
|
38
46
|
def read: (?int? length, ?string outbuf) -> String?
|
|
39
47
|
end
|
data/core/class.rbs
CHANGED
|
@@ -106,6 +106,24 @@ class Class < Module
|
|
|
106
106
|
#
|
|
107
107
|
def allocate: () -> untyped
|
|
108
108
|
|
|
109
|
+
# <!--
|
|
110
|
+
# rdoc-file=object.c
|
|
111
|
+
# - attached_object -> object
|
|
112
|
+
# -->
|
|
113
|
+
# Returns the object for which the receiver is the singleton class.
|
|
114
|
+
#
|
|
115
|
+
# Raises an TypeError if the class is not a singleton class.
|
|
116
|
+
#
|
|
117
|
+
# class Foo; end
|
|
118
|
+
#
|
|
119
|
+
# Foo.singleton_class.attached_object #=> Foo
|
|
120
|
+
# Foo.attached_object #=> TypeError: `Foo' is not a singleton class
|
|
121
|
+
# Foo.new.singleton_class.attached_object #=> #<Foo:0x000000010491a370>
|
|
122
|
+
# TrueClass.attached_object #=> TypeError: `TrueClass' is not a singleton class
|
|
123
|
+
# NilClass.attached_object #=> TypeError: `NilClass' is not a singleton class
|
|
124
|
+
#
|
|
125
|
+
def attached_object: () -> untyped
|
|
126
|
+
|
|
109
127
|
# <!--
|
|
110
128
|
# rdoc-file=object.c
|
|
111
129
|
# - inherited(subclass)
|
|
@@ -160,6 +178,25 @@ class Class < Module
|
|
|
160
178
|
# B.subclasses #=> [C]
|
|
161
179
|
# C.subclasses #=> []
|
|
162
180
|
#
|
|
181
|
+
# Anonymous subclasses (not associated with a constant) are returned, too:
|
|
182
|
+
#
|
|
183
|
+
# c = Class.new(A)
|
|
184
|
+
# A.subclasses # => [#<Class:0x00007f003c77bd78>, D, B]
|
|
185
|
+
#
|
|
186
|
+
# Note that the parent does not hold references to subclasses and doesn't
|
|
187
|
+
# prevent them from being garbage collected. This means that the subclass might
|
|
188
|
+
# disappear when all references to it are dropped:
|
|
189
|
+
#
|
|
190
|
+
# # drop the reference to subclass, it can be garbage-collected now
|
|
191
|
+
# c = nil
|
|
192
|
+
#
|
|
193
|
+
# A.subclasses
|
|
194
|
+
# # It can be
|
|
195
|
+
# # => [#<Class:0x00007f003c77bd78>, D, B]
|
|
196
|
+
# # ...or just
|
|
197
|
+
# # => [D, B]
|
|
198
|
+
# # ...depending on whether garbage collector was run
|
|
199
|
+
#
|
|
163
200
|
def subclasses: () -> Array[Class]
|
|
164
201
|
|
|
165
202
|
# <!--
|
data/core/comparable.rbs
CHANGED
|
@@ -37,24 +37,13 @@
|
|
|
37
37
|
#
|
|
38
38
|
# Module Comparable provides these methods, all of which use method `<=>`:
|
|
39
39
|
#
|
|
40
|
-
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
#
|
|
47
|
-
# : Returns whether `self` is equal to the given object.
|
|
48
|
-
#
|
|
49
|
-
# [>](#method-i-3E)
|
|
50
|
-
# : Returns whether `self` is greater than or equal to the given object.
|
|
51
|
-
#
|
|
52
|
-
# [>=](#method-i-3E-3D)
|
|
53
|
-
# : Returns whether `self` is greater than the given object.
|
|
54
|
-
#
|
|
55
|
-
# * #between? Returns `true` if `self` is between two given objects.
|
|
56
|
-
# #clamp
|
|
57
|
-
# : For given objects `min` and `max`, or range `(min..max)`, returns:
|
|
40
|
+
# * #<: Returns whether `self` is less than the given object.
|
|
41
|
+
# * #<=: Returns whether `self` is less than or equal to the given object.
|
|
42
|
+
# * #==: Returns whether `self` is equal to the given object.
|
|
43
|
+
# * #>: Returns whether `self` is greater than or equal to the given object.
|
|
44
|
+
# * #>=: Returns whether `self` is greater than the given object.
|
|
45
|
+
# * #between?: Returns `true` if `self` is between two given objects.
|
|
46
|
+
# * #clamp: For given objects `min` and `max`, or range `(min..max)`, returns:
|
|
58
47
|
#
|
|
59
48
|
# * `min` if `(self <=> min) < 0`.
|
|
60
49
|
# * `max` if `(self <=> max) > 0`.
|
data/core/complex.rbs
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
#
|
|
6
6
|
# You can create a Complex object explicitly with:
|
|
7
7
|
#
|
|
8
|
-
# * A [complex literal](
|
|
8
|
+
# * A [complex literal](rdoc-ref:syntax/literals.rdoc@Complex+Literals).
|
|
9
9
|
#
|
|
10
10
|
#
|
|
11
11
|
# You can convert certain objects to Complex objects with:
|
|
12
12
|
#
|
|
13
|
-
# * Method
|
|
13
|
+
# * Method #Complex.
|
|
14
14
|
#
|
|
15
15
|
#
|
|
16
16
|
# Complex object can be created as literal, and also by using Kernel#Complex,
|
data/core/data.rbs
ADDED
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
# <!-- rdoc-file=struct.c -->
|
|
2
|
+
# Class Data provides a convenient way to define simple classes for value-alike
|
|
3
|
+
# objects.
|
|
4
|
+
#
|
|
5
|
+
# The simplest example of usage:
|
|
6
|
+
#
|
|
7
|
+
# Measure = Data.define(:amount, :unit)
|
|
8
|
+
#
|
|
9
|
+
# # Positional arguments constructor is provided
|
|
10
|
+
# distance = Measure.new(100, 'km')
|
|
11
|
+
# #=> #<data Measure amount=100, unit="km">
|
|
12
|
+
#
|
|
13
|
+
# # Keyword arguments constructor is provided
|
|
14
|
+
# weight = Measure.new(amount: 50, unit: 'kg')
|
|
15
|
+
# #=> #<data Measure amount=50, unit="kg">
|
|
16
|
+
#
|
|
17
|
+
# # Alternative form to construct an object:
|
|
18
|
+
# speed = Measure[10, 'mPh']
|
|
19
|
+
# #=> #<data Measure amount=10, unit="mPh">
|
|
20
|
+
#
|
|
21
|
+
# # Works with keyword arguments, too:
|
|
22
|
+
# area = Measure[amount: 1.5, unit: 'm^2']
|
|
23
|
+
# #=> #<data Measure amount=1.5, unit="m^2">
|
|
24
|
+
#
|
|
25
|
+
# # Argument accessors are provided:
|
|
26
|
+
# distance.amount #=> 100
|
|
27
|
+
# distance.unit #=> "km"
|
|
28
|
+
#
|
|
29
|
+
# Constructed object also has a reasonable definitions of #== operator, #to_h
|
|
30
|
+
# hash conversion, and #deconstruct/#deconstruct_keys to be used in pattern
|
|
31
|
+
# matching.
|
|
32
|
+
#
|
|
33
|
+
# ::define method accepts an optional block and evaluates it in the context of
|
|
34
|
+
# the newly defined class. That allows to define additional methods:
|
|
35
|
+
#
|
|
36
|
+
# Measure = Data.define(:amount, :unit) do
|
|
37
|
+
# def <=>(other)
|
|
38
|
+
# return unless other.is_a?(self.class) && other.unit == unit
|
|
39
|
+
# amount <=> other.amount
|
|
40
|
+
# end
|
|
41
|
+
#
|
|
42
|
+
# include Comparable
|
|
43
|
+
# end
|
|
44
|
+
#
|
|
45
|
+
# Measure[3, 'm'] < Measure[5, 'm'] #=> true
|
|
46
|
+
# Measure[3, 'm'] < Measure[5, 'kg']
|
|
47
|
+
# # comparison of Measure with Measure failed (ArgumentError)
|
|
48
|
+
#
|
|
49
|
+
# Data provides no member writers, or enumerators: it is meant to be a storage
|
|
50
|
+
# for immutable atomic values. But note that if some of data members is of a
|
|
51
|
+
# mutable class, Data does no additional immutability enforcement:
|
|
52
|
+
#
|
|
53
|
+
# Event = Data.define(:time, :weekdays)
|
|
54
|
+
# event = Event.new('18:00', %w[Tue Wed Fri])
|
|
55
|
+
# #=> #<data Event time="18:00", weekdays=["Tue", "Wed", "Fri"]>
|
|
56
|
+
#
|
|
57
|
+
# # There is no #time= or #weekdays= accessors, but changes are
|
|
58
|
+
# # still possible:
|
|
59
|
+
# event.weekdays << 'Sat'
|
|
60
|
+
# event
|
|
61
|
+
# #=> #<data Event time="18:00", weekdays=["Tue", "Wed", "Fri", "Sat"]>
|
|
62
|
+
#
|
|
63
|
+
# See also Struct, which is a similar concept, but has more container-alike API,
|
|
64
|
+
# allowing to change contents of the object and enumerate it.
|
|
65
|
+
#
|
|
66
|
+
class Data
|
|
67
|
+
# <!--
|
|
68
|
+
# rdoc-file=struct.c
|
|
69
|
+
# - define(name, *symbols) -> class
|
|
70
|
+
# - define(*symbols) -> class
|
|
71
|
+
# -->
|
|
72
|
+
# Defines a new Data class. If the first argument is a string, the class is
|
|
73
|
+
# stored in `Data::<name>` constant.
|
|
74
|
+
#
|
|
75
|
+
# measure = Data.define(:amount, :unit)
|
|
76
|
+
# #=> #<Class:0x00007f70c6868498>
|
|
77
|
+
# measure.new(1, 'km')
|
|
78
|
+
# #=> #<data amount=1, unit="km">
|
|
79
|
+
#
|
|
80
|
+
# # It you store the new class in the constant, it will
|
|
81
|
+
# # affect #inspect and will be more natural to use:
|
|
82
|
+
# Measure = Data.define(:amount, :unit)
|
|
83
|
+
# #=> Measure
|
|
84
|
+
# Measure.new(1, 'km')
|
|
85
|
+
# #=> #<data Measure amount=1, unit="km">
|
|
86
|
+
#
|
|
87
|
+
# Note that member-less Data is acceptable and might be a useful technique for
|
|
88
|
+
# defining several homogenous data classes, like
|
|
89
|
+
#
|
|
90
|
+
# class HTTPFetcher
|
|
91
|
+
# Response = Data.define(:body)
|
|
92
|
+
# NotFound = Data.define
|
|
93
|
+
# # ... implementation
|
|
94
|
+
# end
|
|
95
|
+
#
|
|
96
|
+
# Now, different kinds of responses from `HTTPFetcher` would have consistent
|
|
97
|
+
# representation:
|
|
98
|
+
#
|
|
99
|
+
# #<data HTTPFetcher::Response body="<html...">
|
|
100
|
+
# #<data HTTPFetcher::NotFound>
|
|
101
|
+
#
|
|
102
|
+
# And are convenient to use in pattern matching:
|
|
103
|
+
#
|
|
104
|
+
# case fetcher.get(url)
|
|
105
|
+
# in HTTPFetcher::Response(body)
|
|
106
|
+
# # process body variable
|
|
107
|
+
# in HTTPFetcher::NotFound
|
|
108
|
+
# # handle not found case
|
|
109
|
+
# end
|
|
110
|
+
#
|
|
111
|
+
def self.define: [KLASS < _DataClass] (*Symbol) ?{ (KLASS) [self: KLASS] -> void } -> KLASS
|
|
112
|
+
|
|
113
|
+
interface _DataClass
|
|
114
|
+
# <!--
|
|
115
|
+
# rdoc-file=struct.c
|
|
116
|
+
# - new(*args) -> instance
|
|
117
|
+
# - new(**kwargs) -> instance
|
|
118
|
+
# - ::[](*args) -> instance
|
|
119
|
+
# - ::[](**kwargs) -> instance
|
|
120
|
+
# -->
|
|
121
|
+
# Constructors for classes defined with ::define accept both positional and
|
|
122
|
+
# keyword arguments.
|
|
123
|
+
#
|
|
124
|
+
# Measure = Data.define(:amount, :unit)
|
|
125
|
+
#
|
|
126
|
+
# Measure.new(1, 'km')
|
|
127
|
+
# #=> #<data Measure amount=1, unit="km">
|
|
128
|
+
# Measure.new(amount: 1, unit: 'km')
|
|
129
|
+
# #=> #<data Measure amount=1, unit="km">
|
|
130
|
+
#
|
|
131
|
+
# # Alternative shorter intialization with []
|
|
132
|
+
# Measure[1, 'km']
|
|
133
|
+
# #=> #<data Measure amount=1, unit="km">
|
|
134
|
+
# Measure[amount: 1, unit: 'km']
|
|
135
|
+
# #=> #<data Measure amount=1, unit="km">
|
|
136
|
+
#
|
|
137
|
+
# All arguments are mandatory (unlike Struct), and converted to keyword
|
|
138
|
+
# arguments:
|
|
139
|
+
#
|
|
140
|
+
# Measure.new(amount: 1)
|
|
141
|
+
# # in `initialize': missing keyword: :unit (ArgumentError)
|
|
142
|
+
#
|
|
143
|
+
# Measure.new(1)
|
|
144
|
+
# # in `initialize': missing keyword: :unit (ArgumentError)
|
|
145
|
+
#
|
|
146
|
+
# Note that `Measure#initialize` always receives keyword arguments, and that
|
|
147
|
+
# mandatory arguments are checked in `initialize`, not in `new`. This can be
|
|
148
|
+
# important for redefining initialize in order to convert arguments or provide
|
|
149
|
+
# defaults:
|
|
150
|
+
#
|
|
151
|
+
# Measure = Data.define(:amount, :unit) do
|
|
152
|
+
# NONE = Data.define
|
|
153
|
+
#
|
|
154
|
+
# def initialize(amount:, unit: NONE.new)
|
|
155
|
+
# super(amount: Float(amount), unit:)
|
|
156
|
+
# end
|
|
157
|
+
# end
|
|
158
|
+
#
|
|
159
|
+
# Measure.new('10', 'km') # => #<data Measure amount=10.0, unit="km">
|
|
160
|
+
# Measure.new(10_000) # => #<data Measure amount=10000.0, unit=#<data NONE>>
|
|
161
|
+
#
|
|
162
|
+
%a{annotate:rdoc:copy:Data.new}
|
|
163
|
+
def new: (*untyped) -> Data
|
|
164
|
+
| (**untyped) -> Data
|
|
165
|
+
|
|
166
|
+
%a{annotate:rdoc:copy:Data.[]}
|
|
167
|
+
def []: (*untyped) -> Data
|
|
168
|
+
| (**untyped) -> Data
|
|
169
|
+
|
|
170
|
+
# <!--
|
|
171
|
+
# rdoc-file=struct.c
|
|
172
|
+
# - DataClass::members -> array_of_symbols
|
|
173
|
+
# -->
|
|
174
|
+
# Returns an array of member names of the data class:
|
|
175
|
+
#
|
|
176
|
+
# Measure = Data.define(:amount, :unit)
|
|
177
|
+
# Measure.members # => [:amount, :unit]
|
|
178
|
+
#
|
|
179
|
+
%a{annotate:rdoc:copy:Data.members}
|
|
180
|
+
def members: () -> Array[Symbol]
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
%a{annotate:rdoc:skip}
|
|
184
|
+
def self.new: () -> bot
|
|
185
|
+
|
|
186
|
+
def self.allocate: () -> bot
|
|
187
|
+
|
|
188
|
+
public
|
|
189
|
+
|
|
190
|
+
# <!--
|
|
191
|
+
# rdoc-file=struct.c
|
|
192
|
+
# - self == other -> true or false
|
|
193
|
+
# -->
|
|
194
|
+
# Returns `true` if `other` is the same class as `self`, and all members are
|
|
195
|
+
# equal.
|
|
196
|
+
#
|
|
197
|
+
# Examples:
|
|
198
|
+
#
|
|
199
|
+
# Measure = Data.define(:amount, :unit)
|
|
200
|
+
#
|
|
201
|
+
# Measure[1, 'km'] == Measure[1, 'km'] #=> true
|
|
202
|
+
# Measure[1, 'km'] == Measure[2, 'km'] #=> false
|
|
203
|
+
# Measure[1, 'km'] == Measure[1, 'm'] #=> false
|
|
204
|
+
#
|
|
205
|
+
# Measurement = Data.define(:amount, :unit)
|
|
206
|
+
# # Even though Measurement and Measure have the same "shape"
|
|
207
|
+
# # their instances are never equal
|
|
208
|
+
# Measure[1, 'km'] == Measurement[1, 'km'] #=> false
|
|
209
|
+
#
|
|
210
|
+
def ==: (untyped) -> bool
|
|
211
|
+
|
|
212
|
+
# <!--
|
|
213
|
+
# rdoc-file=struct.c
|
|
214
|
+
# - deconstruct -> array
|
|
215
|
+
# -->
|
|
216
|
+
# Returns the values in `self` as an array, to use in pattern matching:
|
|
217
|
+
#
|
|
218
|
+
# Measure = Data.define(:amount, :unit)
|
|
219
|
+
#
|
|
220
|
+
# distance = Measure[10, 'km']
|
|
221
|
+
# distance.deconstruct #=> [10, "km"]
|
|
222
|
+
#
|
|
223
|
+
# # usage
|
|
224
|
+
# case distance
|
|
225
|
+
# in n, 'km' # calls #deconstruct underneath
|
|
226
|
+
# puts "It is #{n} kilometers away"
|
|
227
|
+
# else
|
|
228
|
+
# puts "Don't know how to handle it"
|
|
229
|
+
# end
|
|
230
|
+
# # prints "It is 10 kilometers away"
|
|
231
|
+
#
|
|
232
|
+
# Or, with checking the class, too:
|
|
233
|
+
#
|
|
234
|
+
# case distance
|
|
235
|
+
# in Measure(n, 'km')
|
|
236
|
+
# puts "It is #{n} kilometers away"
|
|
237
|
+
# # ...
|
|
238
|
+
# end
|
|
239
|
+
#
|
|
240
|
+
def deconstruct: () -> Array[untyped]
|
|
241
|
+
|
|
242
|
+
# <!--
|
|
243
|
+
# rdoc-file=struct.c
|
|
244
|
+
# - deconstruct_keys(array_of_names_or_nil) -> hash
|
|
245
|
+
# -->
|
|
246
|
+
# Returns a hash of the name/value pairs, to use in pattern matching.
|
|
247
|
+
#
|
|
248
|
+
# Measure = Data.define(:amount, :unit)
|
|
249
|
+
#
|
|
250
|
+
# distance = Measure[10, 'km']
|
|
251
|
+
# distance.deconstruct_keys(nil) #=> {:amount=>10, :unit=>"km"}
|
|
252
|
+
# distance.deconstruct_keys([:amount]) #=> {:amount=>10}
|
|
253
|
+
#
|
|
254
|
+
# # usage
|
|
255
|
+
# case distance
|
|
256
|
+
# in amount:, unit: 'km' # calls #deconstruct_keys underneath
|
|
257
|
+
# puts "It is #{amount} kilometers away"
|
|
258
|
+
# else
|
|
259
|
+
# puts "Don't know how to handle it"
|
|
260
|
+
# end
|
|
261
|
+
# # prints "It is 10 kilometers away"
|
|
262
|
+
#
|
|
263
|
+
# Or, with checking the class, too:
|
|
264
|
+
#
|
|
265
|
+
# case distance
|
|
266
|
+
# in Measure(amount:, unit: 'km')
|
|
267
|
+
# puts "It is #{amount} kilometers away"
|
|
268
|
+
# # ...
|
|
269
|
+
# end
|
|
270
|
+
#
|
|
271
|
+
def deconstruct_keys: (?Array[Symbol]?) -> Hash[Symbol, untyped]
|
|
272
|
+
|
|
273
|
+
# <!--
|
|
274
|
+
# rdoc-file=struct.c
|
|
275
|
+
# - self.eql?(other) -> true or false
|
|
276
|
+
# -->
|
|
277
|
+
# Equality check that is used when two items of data are keys of a Hash.
|
|
278
|
+
#
|
|
279
|
+
# The subtle difference with #== is that members are also compared with their
|
|
280
|
+
# #eql? method, which might be important in some cases:
|
|
281
|
+
#
|
|
282
|
+
# Measure = Data.define(:amount, :unit)
|
|
283
|
+
#
|
|
284
|
+
# Measure[1, 'km'] == Measure[1.0, 'km'] #=> true, they are equal as values
|
|
285
|
+
# # ...but...
|
|
286
|
+
# Measure[1, 'km'].eql? Measure[1.0, 'km'] #=> false, they represent different hash keys
|
|
287
|
+
#
|
|
288
|
+
# See also Object#eql? for further explanations of the method usage.
|
|
289
|
+
#
|
|
290
|
+
def eql?: (untyped) -> bool
|
|
291
|
+
|
|
292
|
+
# <!--
|
|
293
|
+
# rdoc-file=struct.c
|
|
294
|
+
# - hash -> integer
|
|
295
|
+
# -->
|
|
296
|
+
# Redefines Object#hash (used to distinguish objects as Hash keys) so that data
|
|
297
|
+
# objects of the same class with same content would have the same `hash` value,
|
|
298
|
+
# and represented the same Hash key.
|
|
299
|
+
#
|
|
300
|
+
# Measure = Data.define(:amount, :unit)
|
|
301
|
+
#
|
|
302
|
+
# Measure[1, 'km'].hash == Measure[1, 'km'].hash #=> true
|
|
303
|
+
# Measure[1, 'km'].hash == Measure[10, 'km'].hash #=> false
|
|
304
|
+
# Measure[1, 'km'].hash == Measure[1, 'm'].hash #=> false
|
|
305
|
+
# Measure[1, 'km'].hash == Measure[1.0, 'km'].hash #=> false
|
|
306
|
+
#
|
|
307
|
+
# # Structurally similar data class, but shouldn't be considered
|
|
308
|
+
# # the same hash key
|
|
309
|
+
# Measurement = Data.define(:amount, :unit)
|
|
310
|
+
#
|
|
311
|
+
# Measure[1, 'km'].hash == Measurement[1, 'km'].hash #=> false
|
|
312
|
+
#
|
|
313
|
+
def hash: () -> Integer
|
|
314
|
+
|
|
315
|
+
# <!--
|
|
316
|
+
# rdoc-file=struct.c
|
|
317
|
+
# - inspect -> string
|
|
318
|
+
# - to_s -> string
|
|
319
|
+
# -->
|
|
320
|
+
# Returns a string representation of `self`:
|
|
321
|
+
#
|
|
322
|
+
# Measure = Data.define(:amount, :unit)
|
|
323
|
+
#
|
|
324
|
+
# distance = Measure[10, 'km']
|
|
325
|
+
#
|
|
326
|
+
# p distance # uses #inspect underneath
|
|
327
|
+
# #<data Measure amount=10, unit="km">
|
|
328
|
+
#
|
|
329
|
+
# puts distance # uses #to_s underneath, same representation
|
|
330
|
+
# #<data Measure amount=10, unit="km">
|
|
331
|
+
#
|
|
332
|
+
def inspect: () -> String
|
|
333
|
+
|
|
334
|
+
# <!--
|
|
335
|
+
# rdoc-file=struct.c
|
|
336
|
+
# - members -> array_of_symbols
|
|
337
|
+
# -->
|
|
338
|
+
# Returns the member names from `self` as an array:
|
|
339
|
+
#
|
|
340
|
+
# Measure = Data.define(:amount, :unit)
|
|
341
|
+
# distance = Measure[10, 'km']
|
|
342
|
+
#
|
|
343
|
+
# distance.members #=> [:amount, :unit]
|
|
344
|
+
#
|
|
345
|
+
def members: () -> Array[Symbol]
|
|
346
|
+
|
|
347
|
+
# <!--
|
|
348
|
+
# rdoc-file=struct.c
|
|
349
|
+
# - to_h -> hash
|
|
350
|
+
# - to_h {|name, value| ... } -> hash
|
|
351
|
+
# -->
|
|
352
|
+
# Returns Hash representation of the data object.
|
|
353
|
+
#
|
|
354
|
+
# Measure = Data.define(:amount, :unit)
|
|
355
|
+
# distance = Measure[10, 'km']
|
|
356
|
+
#
|
|
357
|
+
# distance.to_h
|
|
358
|
+
# #=> {:amount=>10, :unit=>"km"}
|
|
359
|
+
#
|
|
360
|
+
# Like Enumerable#to_h, if the block is provided, it is expected to produce
|
|
361
|
+
# key-value pairs to construct a hash:
|
|
362
|
+
#
|
|
363
|
+
# distance.to_h { |name, val| [name.to_s, val.to_s] }
|
|
364
|
+
# #=> {"amount"=>"10", "unit"=>"km"}
|
|
365
|
+
#
|
|
366
|
+
# Note that there is a useful symmetry between #to_h and #initialize:
|
|
367
|
+
#
|
|
368
|
+
# distance2 = Measure.new(**distance.to_h)
|
|
369
|
+
# #=> #<data Measure amount=10, unit="km">
|
|
370
|
+
# distance2 == distance
|
|
371
|
+
# #=> true
|
|
372
|
+
#
|
|
373
|
+
def to_h: () -> Hash[Symbol, untyped]
|
|
374
|
+
|
|
375
|
+
# <!-- rdoc-file=struct.c -->
|
|
376
|
+
# Returns a string representation of `self`:
|
|
377
|
+
#
|
|
378
|
+
# Measure = Data.define(:amount, :unit)
|
|
379
|
+
#
|
|
380
|
+
# distance = Measure[10, 'km']
|
|
381
|
+
#
|
|
382
|
+
# p distance # uses #inspect underneath
|
|
383
|
+
# #<data Measure amount=10, unit="km">
|
|
384
|
+
#
|
|
385
|
+
# puts distance # uses #to_s underneath, same representation
|
|
386
|
+
# #<data Measure amount=10, unit="km">
|
|
387
|
+
#
|
|
388
|
+
alias to_s inspect
|
|
389
|
+
|
|
390
|
+
# <!--
|
|
391
|
+
# rdoc-file=struct.c
|
|
392
|
+
# - with(**kwargs) -> instance
|
|
393
|
+
# -->
|
|
394
|
+
# Returns a shallow copy of `self` --- the instance variables of `self` are
|
|
395
|
+
# copied, but not the objects they reference.
|
|
396
|
+
#
|
|
397
|
+
# If the method is supplied any keyword arguments, the copy will be created with
|
|
398
|
+
# the respective field values updated to use the supplied keyword argument
|
|
399
|
+
# values. Note that it is an error to supply a keyword that the Data class does
|
|
400
|
+
# not have as a member.
|
|
401
|
+
#
|
|
402
|
+
# Point = Data.define(:x, :y)
|
|
403
|
+
#
|
|
404
|
+
# origin = Point.new(x: 0, y: 0)
|
|
405
|
+
#
|
|
406
|
+
# up = origin.with(x: 1)
|
|
407
|
+
# right = origin.with(y: 1)
|
|
408
|
+
# up_and_right = up.with(y: 1)
|
|
409
|
+
#
|
|
410
|
+
# p origin # #<data Point x=0, y=0>
|
|
411
|
+
# p up # #<data Point x=1, y=0>
|
|
412
|
+
# p right # #<data Point x=0, y=1>
|
|
413
|
+
# p up_and_right # #<data Point x=1, y=1>
|
|
414
|
+
#
|
|
415
|
+
# out = origin.with(z: 1) # ArgumentError: unknown keyword: :z
|
|
416
|
+
# some_point = origin.with(1, 2) # ArgumentError: expected keyword arguments, got positional arguments
|
|
417
|
+
#
|
|
418
|
+
def with: (**untyped) -> instance
|
|
419
|
+
end
|