我是
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::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中最广泛使用的匿名代码块形式是一个名为块的构造,它实际上不是一个对象,而只是一个语法构造. Ruby中的每个方法都只接受一个可选的块参数,可以在大括号中传递,也可以在普通方法参数后使用do / end关键字对传递.您可以在上面的代码中看到一个块正在运行,传递给Hash#each
迭代方法.
如果您有兴趣,这里有一个小玩具项目,演示了使用各种语言的一流闭包,包括Perl5和Perl6,Ruby,PHP,Python,ECMAScript,Smalltalk,Clojure,Scheme等等.其他人:http://joergwmittag.github.io/lambdaconscarcdr/