类型类解决方案中的以下隐式实现有何不同?

时间:2016-02-18 14:37:01

标签: scala types functional-programming typeclass implicit

在下面的例子中:

trait Writer[A] {
 def write(a: A): String
}

case class Person(name: String, age: Int)
case class Student(name: String, roll: Int)

object DefaultStringWriters {
//here is implicit object, when to use object here?

implicit object PersonNameWriter extends Writer[Person] {
  def write(person: Person) = person.name
 }

//here is implicit val, when to use val here?

implicit val studentNameWriter = new Writer[Student] {
  def write(student: Student) = student.name
 }
}

object WriterUtil {
 def stringify[A](data: A)(implicit writer: HtmlWriter[A]): String = {
  writer.write(data)
 }
}

#It works here with both.
WriterUtil.stringify(Person("john", "person@john.com"))
res0: String = john

WriterUtil.stringify(Person("student", "student@student.com"))
res1: String = student

在实际情况下我们何时使用隐式对象或val?

1 个答案:

答案 0 :(得分:1)

的差异

  1. val是在对象初始化期间以指定的顺序创建的。 object是懒惰创建的。

  2. object创建一个新的单例类型(例如PersonNameWriter.typeval创建无类型(如本例所示)或结构类型。

    < / LI>
  3. val可以被覆盖。 object不能。

  4. val可以分配任何表达式,例如Foo()new Fooobject必须是类定义,并且在重用代码的方式方面受到更多限制,例如extends Foo

  5. 如果您不关心这些差异,那么选择哪一个并不重要。在这种情况下,我建议使用val,因为它不需要任何同步。