¿Cómo obtener una tupla para una función variádica con solo un argumento en Scala3?
En el código a continuación, Scala3 ve la lista de argumentos como una tupla, excepto si solamente hay un argumento. ¿Cuál es la mejor manera de convertir el argumento único en una tupla aquí?
import scala.compiletime.*
import scala.deriving.*
object Variadic {
trait Converter[T]:
def convert(x: T): String
given Converter[Int] with
def convert(x: Int) = x.toString
given Converter[String] with
def convert(x: String) = x
inline def arg2String[T <: Tuple](x: T): List[String] =
inline erasedValue[T] match
case _: EmptyTuple => Nil
case _: (t *: ts) =>
val arg = x.asInstanceOf[t *: ts]
summonInline[Converter[t]].convert(arg.head) :: arg2String[ts]
inline def makeString[T <: Tuple](x: T): String = arg2String(x).mkString(",")
def test: String = {
val x = makeString(3, 4, "aa")
println(x)
val y = makeString("s") // No compila
println(y)
}
}
davy.ai
La mejor manera de convertir un único argumento en una tupla en el código anterior sería utilizar el tipo
Tuple1
proporcionado por la biblioteca estándar de Scala. Por ejemplo, para convertir un único valor entero3
en una tupla, podríamos utilizar el siguiente código:El mismo enfoque se puede utilizar para convertir cualquier valor único en una tupla, simplemente envuelve el valor en una instancia de
Tuple1
.