Итак, мы продолжаем наше путешествие к новым типам F#.
На этот раз мы рассмотрим типы сообщений.
Как создать публикацию?
Когда вы создаете новую запись F#, она может напоминать вам об анонимных объектах в C#.Вот как вы их создаете.
Я думаю, что они очень похожи на анонимные объекты в C#, поэтому, если вы использовали C#, записи F# не должны вызывать затруднений.
Все начинается с создания нового типа записи.
В определении типа перечислены имена свойств, а также тип свойств, это можно увидеть ниже.
Если у вас есть определение типа записи, вы можете связать новый экземпляр со значением, используя Let. Опять же пример этого можно увидеть ниже, где мы привязываем новую запись с помощью привязки Let, а также печатаем значения свойств экземпляра записи на вывод консоли.
type Person = { Age : int; Sex: string; Name:string; } .
.
.
.
let sam = { Age = 12; Sex="Male"; Name ="Sam" } printfn "let sam = { Age = 12; Sex=\"Male\"; Name=\"Sam\" }" printfn "Person with Age is %i and Sex is %s and Name is %s" sam.Age sam.Sex sam.Name
Как я могу редактировать/клонировать запись
Вы можете клонировать и изменять запись, что обычно делается следующим образом: let sam = { Age = 12; Sex="Male"; Name ="Sam" }
let tom = { sam with Name="Tom" }
printfn "let tom = { sam with Name=\"Tom\" }"
printfn "Person with Age is %i and Sex is %s and Name is %s" tom.Age tom.Sex tom.Name
Обратите внимание, как мы использовали ключевое слово «with» при создании нового экземпляра Tom Person. Такая форма выражения называется « копировать и обновлять выражение записи Другой вариант, который вы можете использовать (опять же, мы поговорим об этом более подробно в следующем посте) — использовать изменяемое свойство для вашего типа сообщения.
Записи: неизменный по умолчанию; однако вы также можете явно указать поле для изменения.
Вот пример: обратите внимание, как я создал новый тип с изменяемым свойством MutableName. Определив изменяемое поле, я могу обновить значение свойства MutableName записи, что вы можете сделать с помощью "<-" operator. Which simply allows you to assign a new value. type MutableNamePerson = { Age : int; Sex: string; mutable MutableName:string; }
.
.
.
.
//create
let sam = { Age = 12; Sex="Male"; MutableName ="Sam" }
printfn "let sam = { Age = 12; Sex=\"Male\"; Name=\"Sam\" }"
printfn "Person with Age is %i and Sex is %s and Name is %s" sam.Age sam.Sex sam.MutableName
//update
sam.MutableName <- "Name changed"
printfn "sam.MutableName <- \"Name changed\""
printfn "Person with Age is %i and Sex is %s and Name is %s" sam.Age sam.Sex sam.MutableName
Сравнение записей
Типы записей равны, только если ВСЕ свойства считаются одинаковыми.
Вот пример: type Person = { Age : int; Sex: string; Name:string; }
.
.
.
.
let someFunction p1 p2 =
printfn "p1=%A, and p2=%A, are they equal %b" p1 p2 (p1=p2)
let sam = { Age = 12; Sex = "Male"; Name = "Sam" }
let john = { Age = 12; Sex = "Male"; Name = "John" }
let april = { Age = 35; Sex = "Female"; Name = "April" }
let sam2 = { Age = 12; Sex = "Male"; Name = "Sam" }
do someFunction sam john
do someFunction sam april
do someFunction sam sam2
Запись шаблонов сравнения
Конечно, вы можете использовать сопоставление с образцом (обсуждение в другой день), которое является основным методом F#, для сопоставления типов сообщений.
Вот пример: type Person = { Age : int; Sex: string; Name:string; }
.
.
.
.
let someFunction (somePerson :Person) =
match somePerson with
| { Name="Sam" } -> printfn "Sam is in the house"
| _ -> printfn "you aint Sam, get outta here clown"
let sam = { Age = 12; Sex="Male"; Name ="Sam" }
let john = { Age = 12; Sex="Male"; Name ="John" }
do someFunction sam
do someFunction john
Методы и свойства
Также возможно добавлять в записи дополнительных участников.Вот пример, в котором мы добавляем свойство «Подробности», чтобы позволить нам получить полную информацию о записи, используя одно свойство (настолько, насколько мы могли бы достичь, переопределив метод ToString(), но подробнее о методах ООП позже).
Обратите внимание: если вы попытаетесь добавить элемент в определение типа записи, как показано на скриншоте, вы получите странную ошибку.
Это легко решить, просто поместив определения свойств записи на новую строку и убедившись, что элемент также начинается с новой строки, и следите за отступом (пробелом), поскольку все это важно в F #: type Person =
{ Age : int; Sex: string; Name:string; }
member this.Details = this.Age.ToString() + " " + this.Sex.ToString() + " " + this.Name
.
.
.
.
let sam = { Age = 12; Sex = "Male"; Name = "Sam" }
printfn "sam Details=%s" sam.Details
Теги: #.
NET #F#
-
Блоги И Ваша Работа На Дому Интернет-Бизнес
19 Oct, 24 -
Подборка Полезных Слайдов От Джулии Эванс
19 Oct, 24 -
Банановый Мобильный
19 Oct, 24 -
Отвечать Сразу Нескольким
19 Oct, 24