gpt4 book ai didi

ruby - Perl 类似于 ruby​​ 中的匿名子程序

转载 作者:数据小太阳 更新时间:2023-10-29 07:47:37 24 4
gpt4 key购买 nike

我是 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​​ 方式?

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

最佳答案

Ruby 有 Proc s 作为匿名的一流子程序对象。 Proc 可以通过将 block 传递给 Proc::new 来创建, Kernel#proc , 或 Kernel#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 中使用最广泛的匿名代码块形式是一种称为 block 的构造,它实际上不是对象,而只是一种句法构造。 Ruby 中的每个方法都只接受一个可选的 block 参数,可以在花括号中传递,也可以在普通方法参数后使用 do/end 关键字对传递。您可以在上面的代码中看到一个正在运行的 block ,它被传递给 Hash#each迭代法。

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

关于ruby - Perl 类似于 ruby​​ 中的匿名子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34931915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com