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

Ruby 写闭包的正确方法是什么?,ruby,closures,Ruby,Closures,我有一个值X。稍后我会使用这个值。我并不关心这个值是什么,但过一段时间我会得到另一个值Y,我想知道X==Y 保存此类数据的一种方法是创建如下闭包: def createExactMatchClosure(str) return lambda { |t| return str == t } end 现在,我可以使用此代码测试另一个变量是否等于我的原始变量: myOriginalValue = "hello" testerFunction = createExact

我有一个值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

因为第一个版本工作得很好,所以没有理由选择第二个版本

第一个版本和第二个版本之间的唯一区别是,在第二个版本中,有两个变量被关闭,而不是只有一个(
str
string\u to\u test

但是,您只能通过使用
binding
eval
检查lambda的绑定来查看,因此在实践中,差异并不重要。

应该没有任何不同。我不确定Ruby是如何实现闭包的,但直觉上你不需要这样做


闭包通常的工作方式是创建一个对象,该对象将包含对其范围外声明的常量和变量的引用。一种情况是局部变量,另一种情况是参数。我认为这两种方式都不重要。

Ruby风格注意:在不必要的地方避免使用“return”关键字被认为是惯用的。在函数中,createExactMatchClose的主体可以是:
lambda{t|str==t}
。我永远不会采用这种可怕的语法选择。