In this issue, we’ll discuss three elements in the Raku programming language that have the -rw
suffix.
substr-rw
With a regular substr
routine (used as either a method or a function), you get a copy of the substring, which is an immutable value. If you want to modify the original string, you can use substr-rw
.
Consider the following two examples of using it:
my $string = 'Hello, World!'; $string.substr-rw(7, 5) = 'Mundo'; my $greeting := $string.substr-rw(0, 5); $greeting = '¡Hola'; say $string; # ¡Hola, Mundo!
In the first case, we assign the new value to the result of the method call. In the second case, we bind it to a scalar. The original string is modified after both assignments. Notice that the length of the replacement string may differ from the length of the replaced part.
return-rw
You can use return-rw
in places where you traditionally use return
. But with the longer variant, you actually return the object rather than the value.
sub my-value { state $value = 3.14; return-rw $value; } my-value++; say my-value; # 4.14
The my-value++
construct modifies the state
variable inside the function, so you increment it and with the next function call you get the same container with a modified value.
take-rw
A similar pair exists for take
. Use it together with gather
, in which case you return the container and you have full access to it, not only to its value.
Examine the following program, where the gather
block takes $x
and $y
.
my $x = 42; my $y = 2020; my $data := gather { take $x; take-rw $y; }; say $data; # (42 2020), is a Seq # $data[0]++; # Error $data[1]++; say "$x, $y"; # 42, 2021
(Notice that the result is bound to a scalar.)
You cannot modify the value gathered by take $x
, but you can do so with what was returned by take-rw $y
. For the second variable, the program prints its updates value.
* * *
Find the code of this issue on GitHub and browse for more Raku Pearls.