在 Joda LocalDate 上拉皮条我的图书馆不起作用

Pimp my library on Joda LocalDate does not work

我在这里添加了一个新方法 to 到 LocalDate:

object EnhancedDate {
  implicit class EnhancedDate(start: org.joda.time.LocalDate) {
    /** Generates dates between start and end - inclusive */
    def to(end: org.joda.time.LocalDate): IndexedSeq[org.joda.time.LocalDate] = {
      val numberOfDays = Days.daysBetween(start, end.plusDays(1)).getDays()
      for (f <- 0 to numberOfDays) yield start.plusDays(f)
    }
  }
}

现在正在使用它:

import cats.effect.IO
import EnhancedDate.EnhancedDate

def loadCadUsdRates: IO[Map[String, CadInUsd]] = IO {
  val start = new org.joda.time.LocalDate(startYear,1,1)
  val end = new org.joda.time.LocalDate(endYear+1,1,1).minusDays(1)
  start to end map(f) toMap 
}

函数f并不重要;你可以使用 identity 因为结果是一样的。
我使用 Idea 并且 IDE 中的一切都很好(没有红色底层)但是当我 运行 它时我得到这个错误:

Error:(104, 9) value to is not a member of org.joda.time.LocalDate
start to end map(f) toMap

现在我以前用过 pimp my library,我很确定这是正确的方法,但肯定有一些与 joda date 不兼容的东西......你试过 pimping Joda LocalDate.. 我不知道为什么这不起作用

我不太确定这里发生了什么,但这与声明是一个模块有关与其中隐含的class同名.这意味着您在范围内有两个标识符,都称为 EnhancedDate 并且我认为这一定会导致解析歧义。这当然与乔达无关。一种明确的解决方法是 将隐式 class 放在最近的包对象 中。

package object myPackage {
  implicit class EnhancedDate(start: org.joda.time.LocalDate) { ... }
}

这是它不起作用的演示:

scala> :paste
// Entering paste mode (ctrl-D to finish)

object Foo {
  implicit class Foo(s: String) { def foo = println(s"Foo: $s") }
}

// Exiting paste mode, now interpreting.

defined object Foo

scala> import Foo._
import Foo._

scala> "hey".foo
<console>:14: error: value foo is not a member of String
       "hey".foo
             ^

这是有效的:

scala> object Bar {
     | implicit class Foo(s: String) { def foo = println(s"Foo: $s") }
     | }
defined object Bar

scala> import Bar._
import Bar._

scala> "hey".foo
Foo: hey