【问题标题】:How to hide implicit parameters in the middle on apply chain如何在应用链的中间隐藏隐式参数
【发布时间】:2016-11-16 00:02:31
【问题描述】:

简化示例:

class Factory(x : Int) {
  def apply(y : Int)(z : Int) : Int = x + y + z
}

class Sample {
  def get[B <% Int](x : B) = new Factory(x)
}

val s = new Sample

我想要的:s.get(2)(3)(4) 应该输出9。我得到了什么

error: type mismatch;
 found   : Int(3)
 required: Int => Int
       s.get(2)(3)(4)
                ^

这是完全正确的,编译器应该失败。第二个参数列表应该包含隐式转换,但它被省略了。因此出现错误。

问题是如何让编译器知道应该执行隐式解析。

我尝试过但不起作用的方法:

  • s.get(2)()(3)(4)
  • {s get 2}(3)(4)
  • (s get 2)(3)(4)
  • ((s get 2))(3)(4)

显式方式有效,但它需要两行而不是一行:

val b = s get 2
b(3)(4)

我也可以显式使用apply 方法:s.get(2).apply(3)(4) 但它看起来很难看。

如何让编译器在表达式中执行隐式解析?

【问题讨论】:

  • 视图边界 &lt;% 已被弃用。将其更改为 &lt;: 并且它可以工作(至少它为我编译和运行)。
  • 这是一个模型示例。没有隐式转换,真正的程序就无法工作。 &lt;% 仍未被弃用。如果是这样,我会仔细研究任何建议来替代这种结构的替代方案
  • @ayvango 我最近遇到的一个例子:implicit val s = "ss"; def g(implicit s: String) = Map.empty[Int, String]; g(3) 不会编译。

标签: scala implicit


【解决方案1】:

您可以使用显式类型归属

val nine = (s.get(2): Factory)(3)(4)

或者如果你觉得这不方便,构建你自己的控制结构来强制类型推断:

def infer[X](z: => X): X = z
val nineAgain = infer(s get 2)(3)(4)

【讨论】:

    【解决方案2】:
    s.get(2)(implicitly)(3)(4)
    

    implicitly只是Predef中定义的一个方法:def implicitly[A](implicit x: A) = x。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2012-09-02
      相关资源
      最近更新 更多