Policy Center中Gosu块参数类型推断差异问题咨询
Gosu块参数类型推断差异问题:test() vs test1()
问题场景
使用Policy Center v10与GW Studio 5.0.4时,遇到Gosu代码中块参数类型推断不一致的问题:
- 调用
test()函数传入块时,编译器可自动推断块参数为Account类型 - 调用
test1()(一个接收块类型参数的block变量)传入块时,编译器默认将块参数识别为block类型,无法编译,仅显式指定参数类型才能正常运行
相关代码
var account = Account.finder.findAccountByAccountNumber("2251253246") public function test(bl: block(Account): String) { print(bl(account)) } var test1: block(block(Account): String) = \ bl: block(Account): String -> { print(bl(account)) } // 可正常编译:自动推断a为Account类型 test(\a-> a.AccountNumber) // 无法编译:编译器无法推断a的类型,默认识别为block类型 test1(\a -> a.AccountNumber)
原因分析
这是Gosu类型推断机制的限制:
- 对于直接接收块作为参数的函数(如
test()),编译器可以通过函数参数的类型定义block(Account): String,反向推断传入块的参数类型为Account、返回值类型为String - 对于嵌套的block类型(如
test1是接受block(Account): String类型参数的block),编译器不会自动进行多层反向推断。此时传入内层块时,编译器无法从外层block的类型定义中穿透推断内层块的参数类型,必须显式声明参数类型。
解决方案
调用test1时,显式指定块参数的类型即可解决编译问题:
// 显式指定a为Account类型,可正常编译 test1(\a: Account -> a.AccountNumber)
内容的提问来源于stack exchange,提问作者Nazar GW
相关产品推荐
相关产品推荐

