我是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 } };
}
Run Code Online (Sandbox Code Playgroud)
我试过这个:
#!/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
Run Code Online (Sandbox Code Playgroud)
但是,我得到语法错误.这是可能的,还是有另一种首选的红宝石方式?
更新:是的,这就像一个调度表.我将代码存储在哈希中,稍后运行该代码.
Ruby有Procs作为匿名的第一类子例程对象.Proc可以通过将块传递给Proc::new,Kernel#proc或Kernel#lambda,或使用"stabby lambda"lambda文字语法来创建s .
#!/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
Run Code Online (Sandbox Code Playgroud)
Ruby中最广泛使用的匿名代码块形式是一个名为块的构造,它实际上不是一个对象,而只是一个语法构造.Ruby中的每个方法都只接受一个可选的块参数,可以在大括号中传递,也可以在普通方法参数后使用do/ endkeyword对传递.您可以在上面的代码中看到一个块,并传递给Hash#each迭代方法.
如果您有兴趣,这里有一个小玩具项目,演示了使用各种语言的一流闭包,包括Perl5和Perl6,Ruby,PHP,Python,ECMAScript,Smalltalk,Clojure,Scheme等等.其他人:http://joergwmittag.github.io/lambdaconscarcdr/
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |