编写闭包的正确方法是什么?

时间:2010-12-28 20:24:11

标签: ruby closures

我有一个值X.稍后我将使用此值。我实际上并不关心价值是什么,但一段时间后我会得到另一个值Y,我想知道X == Y.

保存此类数据的一种方法是创建一个这样的闭包:

def createExactMatchClosure(str)
    return lambda { |t|
        return str == t
    }
end

现在我可以使用此代码来测试另一个变量是否等于我原来的变量:

myOriginalValue = "hello"
testerFunction = createExactMatchClosure(myOriginalValue)
puts testerFunction.call("hello").to_s # prints true

我的问题是,以下任何更好/更差/不同?我已经看过教程中使用的两种方法。

def createExactMatchClosure(str)
    string_to_test = str
    return lambda { |t|
        return string_to_test == t
    }
end

2 个答案:

答案 0 :(得分:3)

由于第一个版本完美无缺,因此没有理由更喜欢第二个版本。

第一个和第二个版本之间的唯一区别是,在第二个版本中,有两个变量被关闭而不是仅一个(strstring_to_test)。

但是你只能通过使用bindingeval检查lambda的绑定来看到这一点,所以在实践中差异并不重要。

答案 1 :(得分:1)

不应该有任何不同。我不确定Ruby如何处理闭包的细节,但直觉上你不应该这样做。

闭包通常的工作方式是创建一个对象,该对象将保存对在其作用域之外声明的常量和变量的引用。在一种情况下,它是局部变量,在另一种情况下,它是一个参数。我认为这两种方式无关紧要。