15

任意の型 (Int など) から文字列への暗黙的な変換を作成しようとしています...

String への暗黙的な変換は、RichString メソッド (リバースなど) が使用できないことを意味します。

implicit def intToString(i: Int) = String.valueOf(i)
100.toCharArray  // => Array[Char] = Array(1, 0, 0)
100.reverse // => error: value reverse is not a member of Int
100.length // => 3

RichString への暗黙的な変換は、String メソッド (toCharArray など) が使用できないことを意味します。

implicit def intToRichString(i: Int) = new RichString(String.valueOf(i))
100.reverse // => "001"
100.toCharArray  // => error: value toCharArray is not a member of Int
100.length // => 3

両方の暗黙的な変換を使用すると、重複したメソッド (長さなど) があいまいになります。

implicit def intToString(i: Int) = String.valueOf(i)
implicit def intToRichString(i: Int) = new RichString(String.valueOf(i))
100.toCharArray  // => Array[Char] = Array(1, 0, 0)
100.reverse // => "001"
100.length // => both method intToString in object $iw of type 
   // (Int)java.lang.String and method intToRichString in object
   // $iw of type (Int)scala.runtime.RichString are possible 
   // conversion functions from Int to ?{val length: ?}

では、暗黙的に String に変換し、引き続きすべての String および RichString メソッドをサポートすることは可能ですか?

4

6 に答える 6

5

RichString解決策はありませんが、暗黙の後にメソッドが使用できない理由は、 Scalaが暗黙の呼び出しをチェーンしないためであるとコメントしintToStringます (21.2「暗黙のルール」を参照してください)。

中間の を導入するStringと、Scala はRichString(暗黙は で定義されているPredef.scala) への暗黙の変換を行います。

例えば、

$ scala
Welcome to Scala version 2.7.5.final [...].
Type in expressions to have them evaluated.
Type :help for more information.

scala> implicit def intToString(i: Int) = String.valueOf(i)
intToString: (Int)java.lang.String

scala> val i = 100
i: Int = 100

scala> val s: String = i
s: String = 100

scala> s.reverse
res1: scala.runtime.RichString = 001
于 2009-08-27T09:07:52.700 に答える
5

Scala 2.8 の時点で、これは改善されています。この論文(§あいまいさの回避)に従って:

以前は、メソッドの引数の型のみに基づいて、最も具体的なオーバーロードされたメソッドまたは暗黙的な変換が選択されていました。最も具体的なメソッドは、他の選択肢の適切なスーパークラスでは定義できないという追加の条項がありました。このスキームは Scala 2.8 で次のより自由なスキームに置き換えられました。適切なサブクラス。これらの 2 つの比較でより多くのポイントを獲得した場合、代替案は別の選択肢に「勝ちます」。これは特に、代替の引数の型が同じ場合、サブクラスで定義されたものが優先されることを意味します。

例については、他の論文(§6.5) を参照してください。

于 2011-01-16T12:53:03.080 に答える
2

私が見る唯一のオプションは、新しいString WrapperクラスMyStringを作成し、あいまいな場合に呼び出したいメソッドを呼び出せるようにすることです。次に、ライブラリ関数に渡す必要がある場合に備えて、MyStringへの暗黙的な変換と、MyStringからStringおよびRichStringへの2つの暗黙的な変換を定義できます。

于 2009-08-27T06:37:10.663 に答える
2

巨大なプロキシ クラスを作成するか、それを吸い上げて、クライアントに曖昧さをなくすように要求します。

100.asInstanceOf[文字列].length

于 2009-08-27T08:57:50.927 に答える
1

私は混乱しています:.toStringとにかくどのタイプでも使用できないので、暗黙的な変換の必要性を回避できますか?

于 2009-08-27T07:56:25.683 に答える