-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
class.cr
77 lines (67 loc) · 1.3 KB
/
class.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
class Class
def inspect(io)
to_s(io)
end
# See `Object#hash(hasher)`
def hash(hasher)
hasher.class(self)
end
def ==(other : Class)
crystal_type_id == other.crystal_type_id
end
def ===(other)
other.is_a?(self)
end
# Returns the name of this class.
#
# ```
# String.name # => "String"
# ```
def name : String
{{ @type.name.stringify }}
end
# Casts *other* to this class.
#
# This is the same as using `as`, but allows the class to be passed around as
# an argument. See the
# [documentation on as](//crystal-lang.org/docs/syntax_and_semantics/as.html)
# for more information.
#
# ```
# klass = Int32
# number = [99, "str"][0]
# typeof(number) # => (String | Int32)
# typeof(klass.cast(number)) # => Int32
# ```
def cast(other) : self
other.as(self)
end
# Returns the union type of `self` and *other*.
#
# ```
# Int32 | Char # => (Int32 | Char)
# ```
def self.|(other : U.class) forall U
t = uninitialized self
u = uninitialized U
typeof(t, u)
end
# Returns `true` if this class is `Nil`.
#
# ```
# Int32.nilable? # => false
# Nil.nilable? # => true
# ```
def nilable?
self == ::Nil
end
def to_s(io)
io << name
end
def dup
self
end
def clone
self
end
end