为何无法将Kotlin中的populateLoggingEvent扩展函数改为代码块形式?
为什么不能修改populateLoggingEvent函数的定义形式?
先明确原函数和修改后函数的核心差异:
原函数(表达式体形式)
private fun Logging.ILoggingEvent.populateLoggingEvent(eventId: String, data: MutableMap<String, String?> = mutableMapOf()) = LoggingEventData( eventId = eventId, eventName = "LoggingEvent_$eventId", data = data )
这是Kotlin的表达式体函数:用=连接签名和实现,省略return时,会自动把右侧表达式的结果作为函数返回值,返回类型为LoggingEventData。调用这个函数的地方可以直接获取到创建好的LoggingEventData实例,这也是原函数的核心用途——生成并返回日志事件数据对象。
修改后的函数(块体形式)
private fun Logging.ILoggingEvent.populateLoggingEvent(eventId: String, data: MutableMap<String, String?> = mutableMapOf()) { LoggingEventData( eventId = eventId, eventName = "LoggingEvent_$eventId", data = data ) }
这是块体函数:用{}包裹实现逻辑,Kotlin默认会让这类无显式return的函数返回Unit(无返回值)。你在块内创建的LoggingEventData对象只是被实例化后就立刻丢弃了,调用这个函数的地方根本拿不到需要的日志数据对象,完全丧失了原函数的功能。
如果非要改成块体形式,必须显式声明返回类型并添加return语句,才能和原函数行为一致:
private fun Logging.ILoggingEvent.populateLoggingEvent(eventId: String, data: MutableMap<String, String?> = mutableMapOf()): LoggingEventData { return LoggingEventData( eventId = eventId, eventName = "LoggingEvent_$eventId", data = data ) }
内容的提问来源于stack exchange,提问作者Ralf Wickum
相关产品推荐
相关产品推荐

