Атрибуты в XML-литералах принимают только String? - PullRequest
5 голосов
/ 19 декабря 2010

Кажется, что вы должны явно указать значения атрибутов в литералах XML в виде строк:

scala> val foo = 3
foo: Int = 3

scala> <bar id={ foo } />
<console>:10: error: overloaded method constructor UnprefixedAttribute with alternatives:
  (key: String,value: Option[Seq[scala.xml.Node]],next: scala.xml.MetaData)scala.xml.UnprefixedAttribute <and>
  (key: String,value: String,next: scala.xml.MetaData)scala.xml.UnprefixedAttribute <and>
  (key: String,value: Seq[scala.xml.Node],next1: scala.xml.MetaData)scala.xml.UnprefixedAttribute
 cannot be applied to (java.lang.String, Any, scala.xml.MetaData)
<bar id={ foo } />
 ^

scala> <bar id={ foo.toString } />
res16: scala.xml.Elem = <bar id="3"></bar>

Не мог ли конструктор просто принять параметр Any и вызвать для него toString?Поскольку работает следующее,

scala> <bar>{ foo }</bar>
res21: scala.xml.Elem = <bar>3</bar>

в этом API есть небольшая асимметрия.Есть ли какая-то конкретная причина для этого?

1 Ответ

3 голосов
/ 19 декабря 2010

Вы можете добавить неявное преобразование для этого случая:

scala> val foo = 3
foo: Int = 3

scala> implicit def anyToText( a: AnyVal ) = xml.Text( a.toString )
anyToText: (a: AnyVal)scala.xml.Text

scala> <bar id={foo}/>                                         
res2: scala.xml.Elem = <bar id="3"></bar>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...