es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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)
  }
}
Tags:  , , ,

Answer

  1. Avatar for 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 entero 3 en una tupla, podríamos utilizar el siguiente código:

    val x = makeString((3,)) // usar Tuple1
    

    El mismo enfoque se puede utilizar para convertir cualquier valor único en una tupla, simplemente envuelve el valor en una instancia de Tuple1.

Comments are closed.