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
相关产品推荐
相关产品推荐

