【问题标题】:Append to an outer variable in a closure附加到闭包中的外部变量
【发布时间】:2015-09-13 09:46:10
【问题描述】:

我有以下闭包:

def func
  def inner_func
    list << 3 # how to append an element to the outer `list`?
  end

  list = []
  inner_func
  list
end

我不确定如何从inner_funclist 添加一些内容,因为上述尝试是错误的。

【问题讨论】:

  • Ruby 的问题在于它看起来支持嵌套方法,但正如 Piotr 所指出的那样,它不支持。你可以使用例如。过程虽然,如elonflegenheimer.com/2012/07/08/… 所示
  • 我明白了。让你指出如何在我的情况下使用 procs?另外,inner_func 实际上要大得多,将所有内容都塞入 proc 中是否正确?

标签: ruby closures


【解决方案1】:

使用实例方法,像这样:

def func
  def inner_func
    @list << 3 # how to append an element to the outer `list`?
  end

  @list = []
  inner_func
  @list
end

不过看看this - 关于 Ruby 和嵌套方法。

干净的解决方法示例:

def func
  list = []
  inner_func list # => [3]
  inner_func list # => [3, 3]
end

def inner_func(list)
  list << 3
end

【讨论】:

  • 感谢您的详细解答!
【解决方案2】:

Ruby 没有嵌套方法。它确实有 lambda,恰好是闭包。

def func
  list = []
  l = ->{ list << 3}
  l.call
  p list
end

func # => [3]

【讨论】:

  • 谢谢。不幸的是,我的inner_func 是递归的,在这种情况下我该如何使用 lambda?
  • Lambda 可以递归:fac = -&gt;(n){ |n| n==1 ? 1 : n * fac.call(n - 1)}; fac(5).call
猜你喜欢
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多