Pregunta

En el código F # tengo una tupla:

let myWife=("Tijana",32)

Quiero acceder a cada miembro de la tupla por separado. Por ejemplo, esto es lo que quiero lograr, no puedo

Console.WriteLine("My wife is {0} and her age is {1}",myWife[0],myWife[1])

Este código obviamente no funciona, creo que puedes recopilar lo que quiero lograr.

¿Fue útil?

Solución

¿Quieres evitar que tu esposa envejezca haciendo que su edad sea inmutable? :)

Para una tupla que contiene solo dos miembros, puede fst y snd para extraer los miembros de la pareja.

let wifeName = fst myWife;
let wifeAge = snd myWife;

Para tuplas más largas, tendrás que descomprimir la tupla en otras variables. Por ejemplo,

let _, age = myWife;;
let name, age = myWife;;

Otros consejos

Otra cosa muy útil es que la coincidencia de patrones (al igual que cuando se extraen elementos usando " let " vinculación) se puede usar en otras situaciones, por ejemplo, al escribir una función:

let writePerson1 person =
  let name, age = person
  printfn "name = %s, age = %d" name age

// instead of deconstructing the tuple using 'let', 
// we can do it in the declaration of parameters
let writePerson2 (name, age) = 
  printfn "name = %s, age = %d" name age

// in both cases, the call is the same
writePerson1 ("Joe", 20)
writePerson2 ("Joe", 20)

Puedes usar la función fst para obtener el primer elemento, y snd para obtener el segundo ekement. También puedes escribir tu propia 'tercera' función:

let third (_, _, c) = c

Lea más aquí: F # Language reference, Tuples

También puede escribir una función de desempaquetar para una cierta longitud:

let unpack4 tup4 ind =
    match ind, tup4 with
    | 0, (a,_,_,_) -> a
    | 1, (_,b,_,_) -> b
    | 2, (_,_,c,_) -> c
    | 3, (_,_,_,d) -> d
    | _, _ -> failwith (sprintf "Trying to access item %i of tuple with 4 entries." ind) 

o

let unpack4 tup4 ind =
    let (a, b, c, d) = tup4
    match ind with
    | 0 -> a
    | 1 -> b
    | 2 -> c
    | 3 -> d
    | _ -> failwith (sprintf "Trying to access item %i of tuple with 4 entries." ind) 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top