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

带隐式Int=>Int参数的Scala函数未传参仍生效的原因

为什么调用doer(4)时隐式Int => Int参数自动生效了?

嘿,这个问题问得特别好!答案其实藏在Scala默认帮我们做的导入操作里,我给你拆解一下:

  • 首先,Scala编译器会自动帮我们导入scala.Predef包里的所有成员,这个过程完全是隐式的,不需要你手动写import scala.Predef._。
  • 在Predef里有个实用的小函数叫identity,它的核心作用就是返回输入的参数本身,签名长这样:
    def identity[A](x: A): A = x
    
  • 当你调用doer(4)时,编译器需要找一个符合Int => Int类型的隐式参数。这时候它会在当前作用域和默认导入的内容里扫候选——identity函数刚好可以被实例化为Int => Int类型(把泛型参数A指定成Int就行),完美匹配需求。
  • 所以编译器自动把identity[Int]当作隐式参数传给了doer,执行identity(4)自然就返回4啦!

你可以在REPL里验证这个结论:输入implicitly[Int => Int]会返回<function1>,这就是identity的实例;再调用implicitly[Int => Int](5),结果肯定是5,和doer(4)的逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:15:27