我有一个值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
答案 0 :(得分:3)
由于第一个版本完美无缺,因此没有理由更喜欢第二个版本。
第一个和第二个版本之间的唯一区别是,在第二个版本中,有两个变量被关闭而不是仅一个(str
和string_to_test
)。
但是你只能通过使用binding
和eval
检查lambda的绑定来看到这一点,所以在实践中差异并不重要。
答案 1 :(得分:1)
它不应该有任何不同。我不确定Ruby如何处理闭包的细节,但直觉上你不应该这样做。
闭包通常的工作方式是创建一个对象,该对象将保存对在其作用域之外声明的常量和变量的引用。在一种情况下,它是局部变量,在另一种情况下,它是一个参数。我认为这两种方式无关紧要。