14

私は書きます

object MyString {
  implicit def stringToMyString(s: String) = new MyString(s)    
}

class MyString(str: String) {
  def camelize = str.split("_").map(_.capitalize).mkString

  override def toString = str
}


object Parse {
  def main(args: Array[String]) {
    val x = "active_record".camelize
    // ...
  }
}

私のプログラムで。これにより、コンパイル エラーが発生します。挿入したら

  import MyString.stringToMyString

その後、動作します。

Odersky のProgramming in Scalaから、ソースのコンパニオン オブジェクトまたは予想されるターゲット タイプの暗黙的な変換をインポートする必要がないことがわかりました。

4

3 に答える 3

16

ソースまたは予想されるターゲットタイプのコンパニオンオブジェクトでの暗黙的な変換をインポートする必要はありません。

十分に真実です。現在、メソッドcamelizeはクラスで定義されており、実際、そのオブジェクトコンパニオン内MyStringへの暗黙の変換があります。ただし、コードには、予期されるターゲットタイプMyStringであることをコンパイラに通知するものはありません。MyString

代わりに、これを書いた場合:

val x = ("active_record": MyString).camelize

コンパイラはあなたがを期待 "active_record"していることを知っているので、それは機能し、MyStringオブジェクト内の暗黙の変換を検索しますMyString

これは少し制限的に見えるかもしれませんが、実際には多くの場所で機能します。たとえば、次のようになります。

class Fraction(num: Int, denom: Int) {
    ...
    def +(b: Fraction) = ...
    ...
}

そして、あなたはこのようなコードを持っていました:

val x: Fraction = ...
val y = x + 5

現在、期待されるタイプ がでxある+メソッドがあります。したがって、コンパイラは、ここで、オブジェクト内からオブジェクト内への暗黙の変換を探します(オブジェクトが存在する場合は、それがソースタイプであるため、オブジェクト内に変換されます)。FractionIntFractionFractionInt

于 2010-12-31T11:19:53.237 に答える
13

この状況では、コンパイラはメソッドをどこから引き出したかを認識していないため、インポートが必要ですcamelize。タイプがクリアの場合、インポートせずにコンパイルされます。

object Parse {
  def foo(s: MyString) = s.camelize

  def main(args: Array[String]) {
    val x = foo("active_record")
    println(x.toString)
  }
}

Martinの記事に基づいて、Pimpmylibraryパターンを参照してください。

defをトップレベルに配置することはできないため、グローバルスコープで暗黙的な変換を定義することはできないことに注意してください。解決策は、defをオブジェクト内に配置し、それをインポートすることです。

object Implicits {
    implicit def listExtensions[A](xs : List[A]) = new ListExtensions(xs)
}

そして、他のインポートとともに、各ソースファイルの上部に次のように表示されます。

import Implicits._
于 2010-12-31T09:57:48.490 に答える
0

Programming in Scala book の Rational クラスの例を試し、コンパニオン オブジェクトに暗黙的なメソッドを配置しました。

object Rational {
  implicit def intToRational(num: Int) = 
    new Rational(num)
}

しかし、コード

2 + new Rational(1, 2)

動作しません。変換を行うには、単一識別子の規則が適用されます。つまり、コンパニオン オブジェクトで定義されている場合でも、明示的なメソッドをスコープにインポートする必要があります。

于 2011-04-16T06:05:08.310 に答える