Ruby:如何将块的结果作为参数传递

时间:2014-09-15 10:46:00

标签: ruby

我可以将一些评估块的结果作为参数传递给函数吗?

这说明了我想通过使用辅助函数(do_yield)来做什么:

#!/usr/bin/env ruby

def do_yield
    yield
end

def foo a
   #'a' must be an array 
   puts "A: [#{a.join(", ")}]"
end

foo (do_yield{
    a = []
    a << 1
})

我可以在不创建自己的帮助函数的情况下执行此操作吗?最好通过使用该语言的设施,如果语言没有提供方法,那么我是否可以使用现有的功能而不是我自己的do_yield

2 个答案:

答案 0 :(得分:2)

那么,您想将执行某些代码的结果传递给其他代码吗?您只需要将“块”转换为表达式(例如,通过使其成为正确的方法)

def bar
  a = []
  a << 1
end

foo bar

如果你的代码真的很简单(创建数组和追加元素),你可以使用代码分组结构(将几个语句/表达式组合成一个表达式)

foo((a = []; a << 1))

foo(begin
  a = []
  a << 1
end)

就个人而言,我肯定会选择这种方法。更容易阅读。

答案 1 :(得分:0)

您可能希望在此处搜索的术语是lambda - lambda是一个匿名函数,可以作为参数传递。

因此,要使用Lambda进行描述,您可能会这样做:

my_lambda = lambda do 
  a = [] 
  a << 1
end

def foo a
   #'a' must be an array 
   puts "A: [#{a.join(", ")}]"
end

foo my_lambda.call

当然你可以有参数化的lambdas,如果foo期待一个lambda你可以让它调用#{a.call.join(", ")}](你的实际代码到处都是双引号所以不确定它是否会起作用)所以评估只有在通过时才会发生。

这是Ruby的一个有趣且强大的部分,因此值得学习。