Perl就像ruby中的匿名子程序

时间:2016-01-21 18:47:46

标签: ruby perl

我是ruby的新手并试图在ruby中复制这个调用匿名子例程的perl:

Form

我试过了:

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

# Make a reference to a subroutine
my $codes = {
   one => sub {
      say "This is code block one";
      say "And this is code block one's line two"
   },
};

for my $next_code ( keys %{ $codes } ) {
   # Execute anonymous subroutine
   &{ $codes->{ $next_code } };
}

但是,我得到了语法错误。这是可能的,还是有另一种首选的红宝石方式?

更新:是的,这就像一个调度表。我将代码存储在哈希中,稍后运行该代码。

1 个答案:

答案 0 :(得分:7)

Ruby将Proc作为匿名的第一类子例程对象。可以通过将块传递给Proc::newKernel#procKernel#lambda,或使用“stabby lambda”lambda文字语法来创建Proc

#!/usr/bin/env ruby

# Make a reference to a subroutine
codes = {
  one: -> {
    puts "This is code block one"
    puts "And this is code block one's line two"
  }
}

codes.each do |name, code|
  # Execute anonymous subroutine
  code.()
end

Ruby中最广泛使用的匿名代码块形式是一个名为 block 的构造,它实际上不是一个对象,而只是一个句法结构。 Ruby中的每个方法都只使用一个可选的块参数,可以在大括号中传递,也可以在普通方法参数后使用do / end关键字对传递。您可以在上面的代码中看到一个块,并传递给Hash#each迭代方法。

如果您感兴趣,这里有一个小型玩具项目,演示了各种语言的一流闭包,包括Perl5和Perl6,Ruby,PHP,Python,ECMAScript,Smalltalk,Clojure,Scheme和其他许多人:http://joergwmittag.github.io/lambdaconscarcdr/