Tag: 封闭

Ruby中的闭包和for循环

我是Ruby的新手,一些关闭逻辑让我很困惑。 考虑以下代码: array = [] for i in (1..5) array < [5, 5, 5, 5, 5] 这对我来说很有意义,因为我被绑定在循环之外,因此每次循环都会捕获相同的变量。 我也觉得使用每个块可以解决这个问题: array = [] (1..5).each{|i| array < [1, 2, 3, 4, 5] …因为我现在每次都被单独宣布。 但现在我迷路了:为什么我不能通过引入一个中间变量来修复它? array = [] for i in 1..5 j = i array < [5, 5, 5, 5, 5] 因为j每次循环都是新的,我认为每次传递都会捕获一个不同的变量。 例如,这肯定是C#的工作原理,以及我认为 – Lisp的行为与let有关。 但在Ruby中并没有那么多。 真的发生了什么? 编辑:查看答案中的评论; […]

为什么ruby方法没有词法范围?

例如 def test a = “a is for apple” def inner_method a = “something” # this will refer to a different “a” end inner_method puts a end 这有什么理由吗? 块有词法范围,为什么不方法呢? 这会被解决吗?

如何使块本地变量成为ruby 1.9中的默认值?

Ruby 1.9提供了定义块的本地变量而不关闭外部作用域中同名变量的能力: x = 10 proc { |;x| x = 20 }.call x #=> 10 我希望将此行为作为我定义的某些块的默认行为 – 而不必使用|; x,y,z | 语法(注意分号)。 我不认为Ruby允许这种本地,但是有可能破解这个function吗? 我目前有一个解决方案,但它非常难看,因为它需要检查在块结束时查看哪些局部变化,然后将它们恢复为块之前的值。 我不介意你的解决方案是否需要在块的开头指定哪些变量是块本地的,即scope(:x) { x = 20 }

定义一个Ruby中的闭包方法

我正在ruby中的对象中重新定义一个方法,我需要将新方法作为闭包。 例如: def mess_it_up(o) x = “blah blah” def o.to_s puts x # Wrong! x doesn’t exists here, a method is not a closure end end 现在如果我定义一个Proc,它就是一个闭包: def mess_it_up(o) x = “blah blah” xp = Proc.new {|| puts x # This works end # but how do I set it to o.to_s. def o.to_s xp.call […]