The Nil type has only one possible value: nil.
nil is commonly used to represent the absence of a value. For example, String#index returns the position of the character or nil if it's not in the string:
str = "Hello world" str.index 'e' # => 1 str.index 'a' # => nil
In the above example, trying to invoke a method on the returned value will give a compile time error unless both Int32 and Nil define that method:
str = "Hello world" idx = str.index 'e' idx + 1 # Error: undefined method '+' for Nil
The language and the standard library provide short, readable, easy ways to deal with nil, such as Object#try and Object#not_nil!:
str = "Hello world"
# The index of 'e' in str or 0 if not found
idx1 = str.index('e') || 0
idx2 = str.index('a')
if idx2
# Compiles: idx2 can't be nil here
idx2 + 1
end
# Tell the compiler that we are sure the returned
# value is not nil: raises a runtime exception
# if our assumption doesn't hold.
idx3 = str.index('o').not_nil! See Nil literal in the language reference.
Returns true: Nil has only one singleton value: nil.
Writes "nil" to the given IO.
Returns "nil".
Raises NilAssertionError.
Returns 0_u64.
Returns self.
Returns true: Nil has only one singleton value: nil.
Returns false.
Doesn't write anything to the given IO.
Returns an empty string.
Doesn't yield to the block.
Value
Object
Object
Object
Raises NilAssertionError.
If message is given, it is forwarded as error message of NilAssertionError.
See also: Object#not_nil!.
Returns self. This method enables to call the #presence method (see String#presence) on a union with Nil. The idea is to return nil when the value is nil or empty.
config = {"empty" => ""}
config["empty"]?.presence # => nil
config["missing"]?.presence # => nil Doesn't yield to the block.
See also: Object#try.
© 2012–2026 Manas Technology Solutions.
Licensed under the Apache License, Version 2.0.
https://crystal-lang.org/api/1.19.0/Nil.html