What is the meaning of (Any) in Raku - specifically the ()?
When you use the REPL, the result of the expression is shown using say
. The say
function calls the .gist
function on the expression.
Any
is a type-object. Type-objects have a .gist
method that puts the parentheses around them.
The put
function is almost the same as the say
function, but it calls the .Str
function on the expression. And that produces a warning, because you cannot really stringify a type object. Observe the difference:
$ raku -e 'say Any'
(Any)
# raku -e 'put Any'
Use of uninitialized value of type Any in string context.
Methods .^name, .raku, .gist, or .say can be used to stringify it to something meaningful.
in block <unit> at -e line 1
See Classes and Objects, Type System, Type Objects for more information.
There is a very simple answer.
Any
is a class. Specifically it is the default base class for every other class.
In Raku you can pass around a class the same way you can pass an instance.
my $a = 1;
my $b = $a.WHAT;
say $b;
# (Int)
The thing is if you try and use the class as if it were an instance, bad things will happen.
say $b + 4;
# ERROR: … must be an object instance of type 'Int', not a type object of type 'Int'.
When you use the REPL it automatically calls .gist
and prints the result.
.gist
is meant for humans to be able to understand what the value is.
So then why would it add parenthesis around the name of the class?
It makes sense to me that it does that to tell you it isn't a Str
or some other instance.
say 'Str'; # say calls .gist
# Str
say 'abc'.WHAT;
# (Str)
say 'abc'.WHAT.^name;
# Str
say 'abc'.^name;
# Str
All but one of those is an instance of the Str
class.
(Guess which one.)
Basically the parens tell you that it would be an error to try and use it as an instance.