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

Scala传递函数时下划线(_)的作用及与直接传函数名的等价性疑问

Scala中applyDiscount(_)里下划线的作用及与直接传函数名的等价性

下划线的作用

这里的下划线_是Scala里用来将方法转换为函数值的语法糖,属于部分应用函数的一种简写方式。

得先明确Scala里「方法(method)」和「函数(function)」的区别:applyDiscount是一个定义在作用域里的方法,而totalCostWithDiscountFunctionParameter的第三个参数要求的是Double => Double类型的函数值(也就是可以作为参数传递的函数实例)。

当你写applyDiscount(_)时,下划线代表一个匿名的参数占位符——它告诉编译器:“把applyDiscount这个方法包装成一个函数,这个函数接受一个Double参数,然后把这个参数传给applyDiscount方法”。本质上是完成了方法到函数的提升(ETA Expansion)。

和直接传递applyDiscount是否等价?

在你给出的代码场景下,二者完全等价!

Scala编译器自带自动的ETA扩展机制:当它发现你需要传递一个函数类型的参数,但实际传入的是签名匹配的方法时,会自动把这个方法转换成对应的函数值。所以不管你写applyDiscount还是applyDiscount(_),编译器都会帮你完成方法到函数的转换,最终传递给totalCostWithDiscountFunctionParameter的是同一个函数实例,运行结果完全一致。

比如这两行代码的输出没有任何区别:

// 写法1:直接传方法名
println(s"Total cost = ${totalCostWithDiscountFunctionParameter("Glazed Donut")(5)(applyDiscount)}")

// 写法2:用下划线显式转换
println(s"Total cost = ${totalCostWithDiscountFunctionParameter("Glazed Donut")(5)(applyDiscount(_))}")

不过补充一点:在某些复杂上下文里(比如编译器无法自动推导需要函数类型的场景),可能需要显式用_来触发转换,但在你的这段代码里,两种写法没有任何差异。

内容的提问来源于stack exchange,提问作者Jwan622

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:54