gpt4 book ai didi

ruby - 在 Ruby 中比较两个 lambdas/Procs

转载 作者:数据小太阳 更新时间:2023-10-29 07:51:20 25 4
gpt4 key购买 nike

这让我抓狂,我在四处张望之后发帖。

我想知道指向同一个 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

最佳答案

虽然 lambda 是有效等效的,但每次调用 LambdaFunctions.LambdaFunction1 都会返回一个新的 lambda 实例。 procs 仅通过身份而不是通过值来等效是有意义的,因为实际上不可能确定程序等效性。

我的意思是,如果 procs 可以根据它们所做的确定为等效的,那么 lambda { 3 } lambda { 1 + 2 } 将是相等的。对于比这更复杂的 lambda,确定等效性基本上需要解决 halting problem 的问题。 .

要确定等效身份(根据评论),请参阅 Object#equal? :

Unlike ==, the equal? method should never be overridden by subclasses: it is used to determine object identity (that is, a.equal?(b) iff a is the same object as b).

如果你真的需要ab是同一个对象,那么你需要每次都返回相同的lambda;这意味着您需要将 lambda 分配给 LambdaFunctions 类中的实例变量,例如,并返回 that

ruby-1.9.1-p378 > class LambdaFunctions
ruby-1.9.1-p378 ?> @func1 = lambda { |t| t ** 2 }
ruby-1.9.1-p378 ?> def self.LambdaFunction1
ruby-1.9.1-p378 ?> @func1
ruby-1.9.1-p378 ?> end
ruby-1.9.1-p378 ?> end
=> nil
ruby-1.9.1-p378 > a = LambdaFunctions.LambdaFunction1
=> #<Proc:0x0000010099e370@(irb):10 (lambda)>
ruby-1.9.1-p378 > b = LambdaFunctions.LambdaFunction1 # same address as a
=> #<Proc:0x0000010099e370@(irb):10 (lambda)>
ruby-1.9.1-p378 > a == b
=> true

关于ruby - 在 Ruby 中比较两个 lambdas/Procs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3269301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com