You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:30:02