BrowserREPL-button-tip-on BrowserREPL-button-tip-off

EditButtonTip 2025-10-05

class Pair

Key/value pair

class Pair does Associative {}
Code

Consists of two parts, a key and a value. Pairs can be seen as the atomic units in Hashes, and they are also used in conjunction with named arguments and parameters.

There are many syntaxes for creating Pairs:

Pair.new('key', 'value'); # The canonical way
'key' => 'value';         # this...
:key<value>;              # ...means the same as this
:key<value1 value2>;      # But this is key => <value1 value2>
:foo(127);                # short for foo => 127
:127foo;                  # the same foo => 127
Code

Note that last form supports Non-ASCII numerics as well:

# use MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
say (:𝟛math-three);         # OUTPUT: «math-three => 3␤»
Code

But not synthetic (i.e. formed by a digit and additional Unicode marks):

say :7̈a
Code

You can also use an identifier-like literal as key; this will not need the quotes as long as it follows the syntax of ordinary identifiers:

(foo => 127)              # the same   foo => 127
Code

Variants of this are

:key;                     # same as   key => True
:!key;                    # same as key => False
Code

And this other variant, to be used in routine invocation

sub colon-pair( :$key-value ) {
    say $key-value;
}
my $key-value = 'value';
colon-pair( :$key-value );               # OUTPUT: «value␤»
colon-pair( key-value => $key-value );   # OUTPUT: «value␤»
Code

Colon pairs can be chained without a comma to create a List of Pairs. Depending on context you may have to be explicit when assigning colon lists.

sub s(*%h){ say %h.raku };
s :a1:b2;
# OUTPUT: «{:a1, :b2}␤»

my $manna = :a1:b2:c3;
say $manna.^name;
# OUTPUT: «Pair␤»

$manna = (:a1:b2:c3);
say $manna.^name;
# OUTPUT: «List␤»
Code

Any variable can be turned into a Pair of its name and its value.

my $bar = 10;
my $p   = :$bar;
say $p; # OUTPUT: «bar => 10␤»
Code

It is worth noting that when assigning a Scalar as value of a Pair the value holds the container of the value itself. This means that it is possible to change the value from outside of the Pair itself:

my $v = 'value A';
my $pair = a => $v;
$pair.say;  # OUTPUT: «a => value A␤»

$v = 'value B';
$pair.say;  # OUTPUT: «a => value B␤»
Code

Please also note that this behavior is totally unrelated to the way used to build the Pair itself (i.e., explicit usage of new, use of colon, fat arrow), as well as if the Pair is bound to a variable.

It is possible to change the above behavior forcing the Pair to remove the scalar container and to hold the effective value itself via the method freeze:

my $v = 'value B';
my $pair = a => $v;
$pair.freeze;
$v = 'value C';
$pair.say; # OUTPUT: «a => value B␤»
Code

As Pair implements Associative role, its value can be accessed using Associative subscription operator, however, due to Pair's singular nature, the pair's value will be only returned for the pair's key. Nil object will be returned for any other key. Subscript adverbs such as :exists can be used on Pair.

my $pair = a => 5;
say $pair<a>;           # OUTPUT: «5␤»
say $pair<a>:exists;    # OUTPUT: «True␤»
say $pair<no-such-key>; # OUTPUT: «Nil␤»
Code

Methods§

method new§

multi method new(Pair: Mu  $key, Mu  $value)
multi method new(Pair: Mu :$key, Mu :$value)
Code

Constructs a new Pair object.

method ACCEPTS§

multi method ACCEPTS(Pair:D $: %topic)
multi method ACCEPTS(Pair:D $: Pair:D $topic)
multi method ACCEPTS(Pair:D $: Mu $topic)
Code

If %topic is an Associative, looks up the value using invocant's key in it and checks invocant's value .ACCEPTS that value:

say %(:42a) ~~ :42a; # OUTPUT: «True␤»
say %(:42a) ~~ :10a; # OUTPUT: «False␤»
Code

If $topic is another Pair, checks the invocant's key and value .ACCEPTS the $topic's key and value respectively:

say :42a ~~ :42a; # OUTPUT: «True␤»
say :42z ~~ :42a; # OUTPUT: «False␤»
say :10a ~~ :42a; # OUTPUT: «False␤»
Code

If $topic is any other value, the invocant Pair's key is treated as a method name. This method is called on $topic, the Bool result of which is compared against the invocant Pair's Bool value. For example, primality can be tested using smartmatch:

say 3 ~~ :is-prime;             # OUTPUT: «True␤»
say 3 ~~  is-prime => 'truthy'; # OUTPUT: «True␤»
say 4 ~~ :is-prime;             # OUTPUT: «False␤»
Code

This form can also be used to check Bool values of multiple methods on the same object, such as IO::Path, by using Junctions:

say "foo" .IO ~~ :f & :rw; # OUTPUT: «False␤»
say "/tmp".IO ~~ :!f;      # OUTPUT: «True␤»
say "."   .IO ~~ :f | :d;  # OUTPUT: «True␤»
Code

method antipair§

method antipair(Pair:D: --> Pair:D)
Code

Returns a new Pair object with key and value exchanged.

my $p = (d => 'Raku').antipair;
say $p.key;         # OUTPUT: «Raku␤»
say $p.value;       # OUTPUT: «d␤»
Code

method key§

multi method key(Pair:D:)
Code

Returns the key part of the Pair.

my $p = (Raku => "d");
say $p.key; # OUTPUT: «Raku␤»
Code

method value§

multi method value(Pair:D:) is rw
Code

Returns the value part of the Pair.

my $p = (Raku => "d");
say $p.value; # OUTPUT: «d␤»
Code

infix cmp§

multi infix:<cmp>(Pair:D, Pair:D)
Code

The type-agnostic comparator; compares two Pairs. Compares first their key parts, and then compares the value parts if the keys are equal.

my $a = (Apple => 1);
my $b = (Apple => 2);
say $a cmp $b; # OUTPUT: «Less␤»
Code

method fmt§

multi method fmt(Pair:D: Str:D $format --> Str:D)
Code

Takes a format string, and returns a string the key and value parts of the Pair formatted. Here's an example:

my $pair = :Earth(1);
say $pair.fmt("%s is %.3f AU away from the sun")
# OUTPUT: «Earth is 1.000 AU away from the sun␤»
Code

For more about format strings, see sprintf.

method kv§

multi method kv(Pair:D: --> Seq:D)
Code

Returns a two-element Seq with the key and value parts of Pair, in that order. This method is a special case of the same-named method on Hash, which returns all its entries as a list of keys and values.

my $p = (Raku => "d");
say $p.kv[0]; # OUTPUT: «Raku␤»
say $p.kv[1]; # OUTPUT: «d␤»
Code

method pairs§

multi method pairs(Pair:D:)
Code

Returns a list of one Pair, namely this one.

my $p = (Raku => "d");
say $p.pairs.^name; # OUTPUT: «List␤»
say $p.pairs[0];    # OUTPUT: «Raku => d␤»
Code

method antipairs§

multi method antipairs(Pair:D:)
Code

Returns a List containing the antipair of the invocant.

my $p = (d => 'Raku').antipairs;
say $p.^name;                                     # OUTPUT: «List␤»
say $p.first;                                     # OUTPUT: «Raku => d␤»
say $p.first.^name;                               # OUTPUT: «Pair␤»
Code

method invert§

method invert(Pair:D: --> Seq:D)
Code

Returns a Seq. If the .value of the invocant is NOT an Iterable, the Seq will contain a single Pair whose .key is the .value of the invocant and whose .value is the .key of the invocant:

:foo<bar>.invert.raku.say; # OUTPUT: «(:bar("foo"),).Seq␤»
Code

If invocant's .value is an Iterable, the returned Seq will contain the same number of Pairs as items in the .value, with each of those items a .key of a pair and the .key of the invocant the .value of that pair:

:foo<Raku is great>.invert.raku.say;
# OUTPUT: «(:Raku("foo"), :is("foo"), :great("foo")).Seq␤»

:foo{ :42a, :72b }.invert.raku.say;
# OUTPUT: «((:a(42)) => "foo", (:b(72)) => "foo").Seq␤»
Code

To perform the exact .key and .value swap, use .antipair method.

method keys§

multi method keys(Pair:D: --> List:D)
Code

Returns a List containing the key of the invocant.

say (Raku => "d").keys;                           # OUTPUT: «(Raku)␤»
Code

method values§

multi method values(Pair:D: --> List:D)
Code

Returns a List containing the value of the invocant.

say (Raku => "d").values;                         # OUTPUT: «(d)␤»
Code

method freeze§

method freeze(Pair:D:)
Code

Makes the value of the Pair read-only, by removing it from its Scalar container, and returns it.

my $str = "apple";
my $p = Pair.new('key', $str);
$p.value = "orange";              # this works as expected
$p.say;                           # OUTPUT: «key => orange␤»
$p.freeze.say;                    # OUTPUT: «orange␤»
$p.value = "a new apple";         # Fails
CATCH { default { put .^name, ': ', .Str } };
# OUTPUT: «X::Assignment::RO: Cannot modify an immutable Str (apple)␤»
Code

NOTE: this method is deprecated as of 6.d language version. Instead, create a new Pair, with a decontainerized key/value.

$p.=Map.=head.say;                                    # OUTPUT: «orange␤»
Code

method Str§

multi method Str(Pair:D: --> Str:D)
Code

Returns a string representation of the invocant formatted as key ~ \t ~ value.

my $b = eggs => 3;
say $b.Str;                                       # OUTPUT: «eggs 3␤»
Code

method Pair§

method Pair()
Code

Returns the invocant Pair object.

my $pair = eggs => 3;
say $pair.Pair === $pair;                         # OUTPUT: «True␤»
Code

Class relation diagram§

Rakudo Type Relation for Pair Pair Pair Any Any Pair->Any is Associative Associative Pair->Associative does