如何理解Scala返回函数的定义语法及Finagle中Cookie转换代码逻辑
问题1解答
我们可以把这个定义拆成类型声明和实现赋值两部分看:
- 冒号前的
private[netty4] val cookieToNetty: Cookie => NettyCookie是类型声明:说明cookieToNetty是一个作用域限定在netty4包下的常量,类型是Function1[Cookie, NettyCookie](Scala语法糖写作Cookie => NettyCookie),也就是接收1个Cookie类型参数、返回NettyCookie类型结果的单参数函数。 - 等号后的
c => { ... }是这个函数的具体实现:c就是入参的Cookie实例,大括号内的逻辑执行完成后,最终返回的是构造好的NettyCookie实例nc,没有额外返回第二层函数。
你之前的误解是把函数类型的声明和实现的箭头搞混了,这种写法本质是把lambda表达式(函数字面量)赋值给一个指定了函数类型的常量,不属于自动内联的lambda,除非显式加inline关键字修饰。它和普通的方法定义写法:
private[netty4] def cookieToNetty(c: Cookie): NettyCookie = { ... }
在调用效果上基本等价,用val存函数值的写法更适合需要把函数作为一等值传递的场景。
问题2解答
这里没有用到隐式转换,逻辑链路是显式的:
cookieToNetty(cookie)确实返回的是NettyCookie类型的nc对象- 这个NettyCookie对象会作为入参传给
serverEncoder.encode方法,这个编码器的encode方法就是负责把NettyCookie实例序列化为符合HTTP规范的Cookie字符串,返回值就是String类型 - 赋值给
encoded变量的是encode方法的返回值,不是cookieToNetty的返回值,所以自然和encodeServer方法的String返回类型匹配。
内容的提问来源于stack exchange,提问作者Blankman
相关产品推荐
相关产品推荐

