ClojureDart访问Size属性报无call实例方法的解决方法
ClojureDart 访问Dart类属性报
no instance method 'call'解决方法 报错原因
(.height size)是类Clojure语言调用无参成员方法的语法,ClojureDart编译时会将其转成方法调用逻辑,也就是你看到的(size.height() as double),会自动给访问逻辑加调用括号。- Dart中
Size的height、width是实例getter属性,不是可调用方法,加括号调用就会触发has no instance method 'call'错误。 - 编译警告是因为编译器没有推断出
size的明确类型,将其判定为dynamic类型,无法做静态成员合法性校验。
正确访问方式
ClojureDart专门提供了Dart实例属性访问语法,需要在属性名前加短横线,使用.-属性名的格式调用:
;; 访问height属性 (.-height size) ;; 访问width属性 (.-width size)
该写法编译后会生成正确的属性访问代码,不会额外添加调用括号:
(size.height as double) (size.width as double)
消除编译警告
给size变量添加明确的类型标注,编译器就能在编译期校验成员合法性,不再抛出警告,示例:
;; 函数参数处添加Size类型标注 (defn calculate-ratio [^Size size] (/ (.-width size) (.-height size)))
内容的提问来源于stack exchange,提问作者Adina
相关产品推荐
相关产品推荐

