Cela m'a rendu fou, je poste ici après beaucoup de regarder autour.En comparant deux lambdas/Procs en Ruby
Je voudrais savoir si deux variables pointant vers la même proc sont pointant vers la même proc. Je suis sûr que ça doit être quelque chose que je ne reçois pas, par exemple pourquoi toutes ces choses retournent fausses?
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)
Merci Mark, vous l'avez fait beaucoup plus clair. Auparavant, il retournait de nouveaux objets à chaque fois, donc l'égal? la fonction n'allait jamais revenir vrai. Les deux lambdas étaient fonctionnellement identiques mais pas le même objet. Ainsi, si vous créez une version et que vous la retournez dans la méthode, vous pouvez tester son identité. Ce qui suit a plus de sens et fonctionne comme prévu.
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
Je pensais que c'était quelque chose comme ça. Je suppose que la prochaine question que j'ai est de savoir comment vous tester par identité alors? –
Je viens d'écrire l'exemple et je suis revenu pour voir que vous aviez écrit un exemple pour moi. Merci beaucoup, il est assez évident maintenant, il est souligné. –
En fait, dans le cas général, il n'est pas simplement impossible de déterminer l'équivalence programmatique, c'est juste * est * impossible. Période. Preuve: si l'équivalence programmatique était décidable, je pourrais résoudre le problème de l'arrêt comme ceci: 'def halts? (Proc); proc == lambda {alors que c'est vrai; fin} end'. –