提问者:小点点

Raku的IIFE替代品


在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

共2个答案

匿名用户

在块前面插入一个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";
    }
    

    不需要明确地调用它:它会为您调用:-)