Racket中类成员方法无法用于andmap的问题咨询
解决Racket类成员方法无法用于
andmap的问题 嘿,我完全懂你遇到的这个坑!在Racket的类里直接把成员方法传给andmap会报错,核心原因是类的成员方法需要绑定到具体实例才能正常工作,而你直接写is-even?的时候,它只是一个未绑定的方法引用,并不是andmap能直接调用的函数。
为什么全局函数even?没问题?
全局的even?是独立的顶级函数,不需要依附任何对象实例,andmap可以直接拿到它的函数体来调用。但类里的is-even?是实例方法,必须和某个example%的实例关联,Racket才知道要执行哪个对象的方法逻辑。
两种可行的解决方案
方案1:用λ包装并显式调用方法
在andmap里用匿名函数,通过send this来调用当前实例的is-even?方法,这样就把方法和实例绑定起来了:
#lang racket (define example% (class object% (super-new) (define/public (is-even? n) (even? n)) (define/public (test) (println (andmap (λ (n) (send this is-even? n)) '(2 3 4)))))) (let ([tmp (new example%)]) (send tmp test)) ; 输出 #f
方案2:用public-method获取绑定后的函数
Racket提供了public-method函数,它能直接返回一个绑定到当前实例的方法函数,不用手动写匿名函数,更简洁:
#lang racket (define example% (class object% (super-new) (define/public (is-even? n) (even? n)) (define/public (test) (println (andmap (public-method is-even?) '(2 3 4)))))) (let ([tmp (new example%)]) (send tmp test)) ; 输出 #f
原理说明
不管用哪种方法,本质都是让andmap拿到的是一个已绑定实例的可调用函数,而不是未关联实例的方法符号。这样andmap遍历列表时,就能正确调用方法并传递参数了。
内容的提问来源于stack exchange,提问作者J. Allan
相关产品推荐
相关产品推荐

