在 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
我在这里添加了一个新方法 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