這一直在推動着我的堅果,我在這裏張貼了許多四處張望之後。在Ruby中比較兩個lambda/Procs
我想知道兩個指向同一Proc的變量是否指向相同的Proc。 我相信它肯定是我沒有得到的東西,例如爲什麼所有這些返回false?
class LambdaFunctions
def self.LambdaFunction1
lambda { |t| t ** 2}
end
end
a = LambdaFunctions.LambdaFunction1
b = LambdaFunctions.LambdaFunction1
puts LambdaFunctions.LambdaFunction1
puts a
puts b
puts a == b
puts a === b
puts a.eql?(b)
puts a.equal?(b)
puts a == LambdaFunctions.LambdaFunction1
puts a === LambdaFunctions.LambdaFunction1
puts a.eql?(LambdaFunctions.LambdaFunction1)
puts a.equal?(LambdaFunctions.LambdaFunction1)
謝謝馬克,你說得很清楚。 在以前它每次都返回新的對象所以平等?函數永遠不會返回true。兩個lambda在功能上是相同的,但不是同一個對象。 因此,如果您創建一個版本,然後將其返回到該方法中,您可以測試其身份。 以下更有意義,並按我的意圖工作。
class LambdaFunctions
@lambda1 = lambda { |t| t ** 2}
@lambda2 = lambda { |t| t ** 2}
def self.LambdaFunction1
@lambda1
end
def self.LambdaFunction2
@lambda2
end
end
func1 = LambdaFunctions.LambdaFunction1
func2 = LambdaFunctions.LambdaFunction1
func3 = LambdaFunctions.LambdaFunction2
puts func1.equal?(func2) # true
puts func1.equal?(func3) # false
puts func1.equal?(LambdaFunctions.LambdaFunction1) # true
puts func3.equal?(LambdaFunctions.LambdaFunction1) # false
puts func3.equal?(LambdaFunctions.LambdaFunction2) # true
我認爲這可能是類似的東西。我想下一個問題是,你如何通過身份測試? – 2010-07-16 22:41:28
我剛剛寫了這個例子,並回過頭來看看你爲我寫了一個例子。非常感謝,現在已經明確指出了這一點。 – 2010-07-16 23:01:13
實際上,在一般情況下,確定程序化等價並不是不可能,它只是*是*不可能的。期。證明:如果編程等價性是可確定的,我可以像這樣解決暫停問題:'def halts?(proc); proc == lambda {while true;結束}結束。 – 2010-07-16 23:02:55