Perl 就像 ruby 中的匿名子例程



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

#!/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 } };
}

我试过这个:

#!/usr/bin/ruby -w
codes = {
   one: puts "This is code block one"
        puts "And this is code block one's line two",
 }
codes.each do |next_code|
   next_code
end

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

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

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

#!/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 中使用最广泛的匿名代码块形式是一种称为的构造,它实际上是一个对象,而只是一个语法构造。Ruby 中的每个方法都只接受一个可选的块参数,该参数可以用大括号传递,也可以在普通方法参数后使用 do/end 关键字对传递。您可以在上面的代码中看到一个块在运行,它被传递给Hash#each迭代方法。

如果你有兴趣,这里有一个我的小玩具项目,它演示了各种语言的一流闭包的使用,包括Perl5和Perl6,Ruby,PHP,Python,ECMAScript,Smalltalk,Clojure,Scheme等等:http://joergwmittag.github.io/lambdaconscarcdr/

最新更新