我可以将一些评估块的结果作为参数传递给函数吗?
这说明了我想通过使用辅助函数(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
答案 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的一个有趣且强大的部分,因此值得学习。