在Ruby中,我可以像这样用一个开始块将一些代码行组合在一起:
x = begin
puts "Hi!"
a = 2
b = 3
a + b
end
puts x # 5
它会立即被评估,并且它的值是块的最后一个值(这里是a b
)(Javascri<--atag--32/>对IIFE做了类似的事情)
在拉库有什么方法可以做到这一点?有什么比:
my $x = ({
say "Hi!";
my $a = 2;
my $b = 3;
$a + $b;
})();
say $x; # 5
在块前面插入一个do
。这告诉Raku:
>
立即执行右侧do
后面的任何操作;
将值返回到do
的左侧:
my $x = do {
put "Hi!";
my $a = 2;
my $b = 3;
$a + $b;
}
也就是说,很少需要使用do
。
取而代之的是,Raku中还有许多其他的IIFE形式,它们可以自然地工作而不会大惊小怪。我只提到两个,因为它们在Raku代码中被广泛使用:
with whatever { .foo } else { .bar }
你可能认为我很傻,但这是两个IIFE。它们形成词法范围,具有参数列表,从参数绑定,工作。大量Raku构造就是这样工作的。
在上面的例子中,我没有写一个显式的参数列表,这是不明显的。事实上,. foo
在任何
上被调用,如果定义了任何
,.bar
在它上面被调用,这既是隐式的,也是由于与
的特定IIFE调用行为。
另请参阅if
、而
、给定
等等。
如果您使用引入显式参数列表,则会变得更加明显-
for whatever -> $a, $b { say $a + $b }
迭代任何
,将其中的两个连续元素绑定到$a
和$b
,直到任何
为空。如果它有奇数个元素,可以写:
for whatever -> $a, $b? { say $a + $b }
等等。
底线:Raku中大量出现的{…}
都是IIFE,即使它们看起来不像。但是如果它们紧跟在=
之后,Raku默认假设您要分配lambda而不是立即执行它,因此您需要在该特定情况下插入do
。
欢迎来到拉库!
my $x = BEGIN {
say "Hi!";
my $a = 2;
my $b = 3;
$a + $b;
}
我猜Raku和Ruby的共同祖先表明:-)
另请注意,要创建常量,您还可以使用常量
:
my constant $x = do {
say "Hi!";
my $a = 2;
my $b = 3;
$a + $b;
}
如果您可以有一个语句,您可以省略大括号:
my $x = BEGIN 2 + 3;
或:
my constant $x = 2 + 3;
关于块:如果它们在接收器上下文中(类似于某些语言中的“void”上下文),那么它们将像这样执行:
{
say "Executing block";
}
不需要明确地调用它:它会为您调用:-)