abstract class Class

Defined in:

class.cr
primitives.cr

Class Method Summary

Instance Method Summary

Macro Summary

Instance methods inherited from struct Value

==(other) ==, dup dup

Instance methods inherited from class Object

!=(other) !=, !~(other) !~, ==(other) ==, ===(other : JSON::Any)
===(other : YAML::Any)
===(other)
===
, =~(other) =~, class class, dup dup, hash hash, inspect(io : IO)
inspect
inspect
, itself itself, not_nil! not_nil!, pretty_inspect(width = 79, newline = "\n", indent = 0) : String pretty_inspect, pretty_print(pp : PrettyPrint) : Nil pretty_print, tap(&block) tap, to_json to_json, to_pretty_json(indent : String = " ")
to_pretty_json(io : IO, indent : String = " ")
to_pretty_json
, to_s
to_s(io : IO)
to_s
, to_yaml(io : IO)
to_yaml
to_yaml
, try(&block) try

Class methods inherited from class Object

==(other : Class) ==, ===(other) ===, cast(other) : self cast, clone clone, dup dup, from_json(string_or_io, root : String) : self
from_json(string_or_io) : self
from_json
, from_yaml(string_or_io) : self from_yaml, hash hash, inspect(io) inspect, name : String name, nilable? nilable?, to_s(io) to_s, |(other : U.class) forall U |

Class Method Detail

def self.==(other : Class) #

[View source]
def self.===(other) #

[View source]
def self.cast(other) : self #

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 for more information.

klass = Int32
number = [99, "str"][0]
typeof(number)             # => (String | Int32)
typeof(klass.cast(number)) # => Int32

[View source]
def self.clone #

[View source]
def self.dup #

[View source]
def self.from_json(string_or_io, root : String) : self #

Deserializes the given JSON in string_or_io into an instance of self, assuming the JSON consists of an JSON object with key root, and whose value is the value to deserialize.

Int32.from_json(%({"main": 1}), root: "main") # => 1

[View source]
def self.from_json(string_or_io) : self #

Deserializes the given JSON in string_or_io into an instance of self. This simply creates a parser = JSON::PullParser and invokes new(parser): classes that want to provide JSON deserialization must provide an def initialize(parser : JSON::PullParser method.

Int32.from_json("1")                # => 1
Array(Int32).from_json("[1, 2, 3]") # => [1, 2, 3]

[View source]
def self.from_yaml(string_or_io) : self #

[View source]
def self.hash #

[View source]
def self.inspect(io) #

[View source]
def self.name : String #

Returns the name of this class.

String.name # => "String"

[View source]
def self.nilable? #

Returns true if this class is Nil.

Int32.nilable? # => false
Nil.nilable?   # => true

[View source]
def self.to_s(io) #

[View source]
def self.|(other : U.class) forall U #

Returns the union type of self and other.

Int32 | Char # => (Int32 | Char)

[View source]

Instance Method Detail

def ==(other : Class) #

[View source]
def ===(other) #

[View source]
def cast(other) : self #

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 for more information.

klass = Int32
number = [99, "str"][0]
typeof(number)             # => (String | Int32)
typeof(klass.cast(number)) # => Int32

[View source]
def clone #

[View source]
def dup #

[View source]
def from_json(string_or_io, root : String) : self #

Deserializes the given JSON in string_or_io into an instance of self, assuming the JSON consists of an JSON object with key root, and whose value is the value to deserialize.

Int32.from_json(%({"main": 1}), root: "main") # => 1

[View source]
def from_json(string_or_io) : self #

Deserializes the given JSON in string_or_io into an instance of self. This simply creates a parser = JSON::PullParser and invokes new(parser): classes that want to provide JSON deserialization must provide an def initialize(parser : JSON::PullParser method.

Int32.from_json("1")                # => 1
Array(Int32).from_json("[1, 2, 3]") # => [1, 2, 3]

[View source]
def from_yaml(string_or_io) : self #

[View source]
def hash #

[View source]
def inspect(io) #

[View source]
def name : String #

Returns the name of this class.

String.name # => "String"

[View source]
def nilable? #

Returns true if this class is Nil.

Int32.nilable? # => false
Nil.nilable?   # => true

[View source]
def to_s(io) #

[View source]
def |(other : U.class) forall U #

Returns the union type of self and other.

Int32 | Char # => (Int32 | Char)

[View source]

Macro Detail

macro class_getter(*names) #

Defines getter methods for each of the given arguments.

Writing:

class Person
  class_getter name
end

Is the same as writing:

class Person
  def self.name
    @@name
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  class_getter :name, "age"
end

If a type declaration is given, a variable with that name is declared with that type.

class Person
  class_getter name : String
end

Is the same as writing:

class Person
  @@name : String

  def self.name : String
    @@name
  end
end

The type declaration can also include an initial value:

class Person
  class_getter name : String = "John Doe"
end

Is the same as writing:

class Person
  @@name : String = "John Doe"

  def self.name : String
    @@name
  end
end

An assignment can be passed too, but in this case the type of the variable must be easily inferrable from the initial value:

class Person
  class_getter name = "John Doe"
end

Is the same as writing:

class Person
  @@name = "John Doe"

  def self.name : String
    @@name
  end
end

If a block is given to the macro, a getter is generated with a variable that is lazily initialized with the block's contents:

class Person
  class_getter(birth_date) { Time.now }
end

Is the same as writing:

class Person
  def self.birth_date
    @@birth_date ||= Time.now
  end
end

[View source]
macro class_getter!(*names) #

Defines raise-on-nil and nilable getter methods for each of the given arguments.

Writing:

class Person
  class_getter! name
end

Is the same as writing:

class Person
  def self.name?
    @@name
  end

  def self.name
    @@name.not_nil!
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  class_getter! :name, "age"
end

If a type declaration is given, a variable with that name is declared with that type, as nilable.

class Person
  class_getter! name : String
end

is the same as writing:

class Person
  @@name : String?

  def self.name?
    @@name
  end

  def self.name
    @@name.not_nil!
  end
end

[View source]
macro class_getter?(*names) #

Defines query getter methods for each of the given arguments.

Writing:

class Person
  class_getter? happy
end

Is the same as writing:

class Person
  def self.happy?
    @@happy
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  class_getter? :happy, "famous"
end

If a type declaration is given, a variable with that name is declared with that type.

class Person
  class_getter? happy : Bool
end

is the same as writing:

class Person
  @@happy : Bool

  def self.happy? : Bool
    @@happy
  end
end

The type declaration can also include an initial value:

class Person
  class_getter? happy : Bool = true
end

Is the same as writing:

class Person
  @@happy : Bool = true

  def self.happy? : Bool
    @@happy
  end
end

An assignment can be passed too, but in this case the type of the variable must be easily inferrable from the initial value:

class Person
  class_getter? happy = true
end

Is the same as writing:

class Person
  @@happy = true

  def self.happy?
    @@happy
  end
end

[View source]
macro class_property(*names) #

Defines property methods for each of the given arguments.

Writing:

class Person
  class_property name
end

Is the same as writing:

class Person
  def self.name=(@@name)
  end

  def self.name
    @@name
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  class_property :name, "age"
end

If a type declaration is given, a variable with that name is declared with that type.

class Person
  class_property name : String
end

Is the same as writing:

class Person
  @@name : String

  def self.name=(@@name)
  end

  def self.name
    @@name
  end
end

The type declaration can also include an initial value:

class Person
  class_property name : String = "John Doe"
end

Is the same as writing:

class Person
  @@name : String = "John Doe"

  def self.name=(@@name : String)
  end

  def self.name
    @@name
  end
end

An assignment can be passed too, but in this case the type of the variable must be easily inferrable from the initial value:

class Person
  class_property name = "John Doe"
end

Is the same as writing:

class Person
  @@name = "John Doe"

  def self.name=(@@name : String)
  end

  def self.name
    @@name
  end
end

If a block is given to the macro, a property is generated with a variable that is lazily initialized with the block's contents:

class Person
  class_property(birth_date) { Time.now }
end

Is the same as writing:

class Person
  def self.birth_date
    @@birth_date ||= Time.now
  end

  def self.birth_date=(@@birth_date)
  end
end

[View source]
macro class_property!(*names) #

Defines raise-on-nil property methods for each of the given arguments.

Writing:

class Person
  class_property! name
end

Is the same as writing:

class Person
  def self.name=(@@name)
  end

  def self.name?
    @@name
  end

  def self.name
    @@name.not_nil!
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  class_property! :name, "age"
end

If a type declaration is given, a variable with that name is declared with that type, as nilable.

class Person
  class_property! name : String
end

Is the same as writing:

class Person
  @@name : String?

  def self.name=(@@name)
  end

  def self.name?
    @@name
  end

  def self.name
    @@name.not_nil!
  end
end

[View source]
macro class_property?(*names) #

Defines query property methods for each of the given arguments.

Writing:

class Person
  class_property? happy
end

Is the same as writing:

class Person
  def self.happy=(@@happy)
  end

  def self.happy?
    @@happy
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  class_property? :happy, "famous"
end

If a type declaration is given, a variable with that name is declared with that type.

class Person
  class_property? happy : Bool
end

Is the same as writing:

class Person
  @@happy : Bool

  def self.happy=(@@happy)
  end

  def self.happy?
    @@happy
  end

  def self.happy
    @@happy.not_nil!
  end
end

The type declaration can also include an initial value:

class Person
  class_property? happy : Bool = true
end

Is the same as writing:

class Person
  @@happy : Bool = true

  def self.happy=(@@happy : Bool)
  end

  def self.happy? : Bool
    @@happy
  end
end

An assignment can be passed too, but in this case the type of the variable must be easily inferrable from the initial value:

class Person
  class_property? happy = true
end

Is the same as writing:

class Person
  @@happy = true

  def self.happy=(@@happy)
  end

  def self.happy?
    @@happy
  end
end

[View source]
macro class_setter(*names) #

Defines setter methods for each of the given arguments.

Writing:

class Person
  class_setter name
end

Is the same as writing:

class Person
  def self.name=(@@name)
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  class_setter :name, "age"
end

If a type declaration is given, a variable with that name is declared with that type.

class Person
  class_setter name : String
end

is the same as writing:

class Person
  @@name : String

  def self.name=(@@name : String)
  end
end

The type declaration can also include an initial value:

class Person
  class_setter name : String = "John Doe"
end

Is the same as writing:

class Person
  @@name : String = "John Doe"

  def self.name=(@@name : String)
  end
end

An assignment can be passed too, but in this case the type of the variable must be easily inferrable from the initial value:

class Person
  class_setter name = "John Doe"
end

Is the same as writing:

class Person
  @@name = "John Doe"

  def self.name=(@@name)
  end
end

[View source]
macro def_clone #

Defines a #clone method that returns a copy of this object with all instance variables cloned (#clone is in turn invoked on them).


[View source]
macro def_equals(*fields) #

Defines an #== method by comparing the given fields.

The generated #== method has a self restriction.

class Person
  def initialize(@name, @age)
  end

  # Define a `==` method that compares @name and @age
  def_equals @name, @age
end

[View source]
macro def_equals_and_hash(*fields) #

Defines #hash and #== method from the given fields.

The generated #== method has a self restriction.

class Person
  def initialize(@name, @age)
  end

  # Define a hash method based on @name and @age
  # Define a `==` method that compares @name and @age
  def_equals_and_hash @name, @age
end

[View source]
macro def_hash(*fields) #

Defines a #hash method computed from the given fields.

class Person
  def initialize(@name, @age)
  end

  # Define a hash method based on @name and @age
  def_hash @name, @age
end

[View source]
macro delegate(*methods, to object) #

Delegate methods to to.

Note that due to current language limitations this is only useful when no captured blocks are involved.

class StringWrapper
  def initialize(@string : String)
  end

  delegate downcase, to: @string
  delegate gsub, to: @string
  delegate empty?, capitalize, to: @string
end

wrapper = StringWrapper.new "HELLO"
wrapper.downcase       # => "hello"
wrapper.gsub(/E/, "A") # => "HALLO"
wrapper.empty?         # => false
wrapper.capitalize     # => "Hello"

[View source]
macro forward_missing_to(delegate) #

Forwards missing methods to delegate.

class StringWrapper
  def initialize(@string : String)
  end

  forward_missing_to @string
end

wrapper = StringWrapper.new "HELLO"
wrapper.downcase       # => "hello"
wrapper.gsub(/E/, "A") # => "HALLO"

[View source]
macro getter(*names) #

Defines getter methods for each of the given arguments.

Writing:

class Person
  getter name
end

Is the same as writing:

class Person
  def name
    @name
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  getter :name, "age"
end

If a type declaration is given, a variable with that name is declared with that type.

class Person
  getter name : String
end

Is the same as writing:

class Person
  @name : String

  def name : String
    @name
  end
end

The type declaration can also include an initial value:

class Person
  getter name : String = "John Doe"
end

Is the same as writing:

class Person
  @name : String = "John Doe"

  def name : String
    @name
  end
end

An assignment can be passed too, but in this case the type of the variable must be easily inferrable from the initial value:

class Person
  getter name = "John Doe"
end

Is the same as writing:

class Person
  @name = "John Doe"

  def name : String
    @name
  end
end

If a block is given to the macro, a getter is generated with a variable that is lazily initialized with the block's contents:

class Person
  getter(birth_date) { Time.now }
end

Is the same as writing:

class Person
  def birth_date
    @birth_date ||= Time.now
  end
end

[View source]
macro getter!(*names) #

Defines raise-on-nil and nilable getter methods for each of the given arguments.

Writing:

class Person
  getter! name
end

Is the same as writing:

class Person
  def name?
    @name
  end

  def name
    @name.not_nil!
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  getter! :name, "age"
end

If a type declaration is given, a variable with that name is declared with that type, as nilable.

class Person
  getter! name : String
end

is the same as writing:

class Person
  @name : String?

  def name?
    @name
  end

  def name
    @name.not_nil!
  end
end

[View source]
macro getter?(*names) #

Defines query getter methods for each of the given arguments.

Writing:

class Person
  getter? happy
end

Is the same as writing:

class Person
  def happy?
    @happy
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  getter? :happy, "famous"
end

If a type declaration is given, a variable with that name is declared with that type.

class Person
  getter? happy : Bool
end

is the same as writing:

class Person
  @happy : Bool

  def happy? : Bool
    @happy
  end
end

The type declaration can also include an initial value:

class Person
  getter? happy : Bool = true
end

Is the same as writing:

class Person
  @happy : Bool = true

  def happy? : Bool
    @happy
  end
end

An assignment can be passed too, but in this case the type of the variable must be easily inferrable from the initial value:

class Person
  getter? happy = true
end

Is the same as writing:

class Person
  @happy = true

  def happy?
    @happy
  end
end

[View source]
macro property(*names) #

Defines property methods for each of the given arguments.

Writing:

class Person
  property name
end

Is the same as writing:

class Person
  def name=(@name)
  end

  def name
    @name
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  property :name, "age"
end

If a type declaration is given, a variable with that name is declared with that type.

class Person
  property name : String
end

Is the same as writing:

class Person
  @name : String

  def name=(@name)
  end

  def name
    @name
  end
end

The type declaration can also include an initial value:

class Person
  property name : String = "John Doe"
end

Is the same as writing:

class Person
  @name : String = "John Doe"

  def name=(@name : String)
  end

  def name
    @name
  end
end

An assignment can be passed too, but in this case the type of the variable must be easily inferrable from the initial value:

class Person
  property name = "John Doe"
end

Is the same as writing:

class Person
  @name = "John Doe"

  def name=(@name : String)
  end

  def name
    @name
  end
end

If a block is given to the macro, a property is generated with a variable that is lazily initialized with the block's contents:

class Person
  property(birth_date) { Time.now }
end

Is the same as writing:

class Person
  def birth_date
    @birth_date ||= Time.now
  end

  def birth_date=(@birth_date)
  end
end

[View source]
macro property!(*names) #

Defines raise-on-nil property methods for each of the given arguments.

Writing:

class Person
  property! name
end

Is the same as writing:

class Person
  def name=(@name)
  end

  def name?
    @name
  end

  def name
    @name.not_nil!
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  property! :name, "age"
end

If a type declaration is given, a variable with that name is declared with that type, as nilable.

class Person
  property! name : String
end

Is the same as writing:

class Person
  @name : String?

  def name=(@name)
  end

  def name?
    @name
  end

  def name
    @name.not_nil!
  end
end

[View source]
macro property?(*names) #

Defines query property methods for each of the given arguments.

Writing:

class Person
  property? happy
end

Is the same as writing:

class Person
  def happy=(@happy)
  end

  def happy?
    @happy
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  property? :happy, "famous"
end

If a type declaration is given, a variable with that name is declared with that type.

class Person
  property? happy : Bool
end

Is the same as writing:

class Person
  @happy : Bool

  def happy=(@happy)
  end

  def happy?
    @happy
  end

  def happy
    @happy.not_nil!
  end
end

The type declaration can also include an initial value:

class Person
  property? happy : Bool = true
end

Is the same as writing:

class Person
  @happy : Bool = true

  def happy=(@happy : Bool)
  end

  def happy? : Bool
    @happy
  end
end

An assignment can be passed too, but in this case the type of the variable must be easily inferrable from the initial value:

class Person
  property? happy = true
end

Is the same as writing:

class Person
  @happy = true

  def happy=(@happy)
  end

  def happy?
    @happy
  end
end

[View source]
macro setter(*names) #

Defines setter methods for each of the given arguments.

Writing:

class Person
  setter name
end

Is the same as writing:

class Person
  def name=(@name)
  end
end

The arguments can be string literals, symbol literals or plain names:

class Person
  setter :name, "age"
end

If a type declaration is given, a variable with that name is declared with that type.

class Person
  setter name : String
end

is the same as writing:

class Person
  @name : String

  def name=(@name : String)
  end
end

The type declaration can also include an initial value:

class Person
  setter name : String = "John Doe"
end

Is the same as writing:

class Person
  @name : String = "John Doe"

  def name=(@name : String)
  end
end

An assignment can be passed too, but in this case the type of the variable must be easily inferrable from the initial value:

class Person
  setter name = "John Doe"
end

Is the same as writing:

class Person
  @name = "John Doe"

  def name=(@name)
  end
end

[View source]