Как я могу объявить объект в другом классе на F #? - PullRequest
2 голосов
/ 14 мая 2019

Я совершенно новичок в F # и пытаюсь создать объект, содержащий еще один экземпляр из другого класса. Для меня в C # это довольно легко, но в F # у меня есть серьезные проблемы, чтобы понять это.

Вот мой код

module Owe

type Owe= class

val Name: string
val Amount: float

new (name, amount) as this =
{
    Name = name
    Amount = amount
}
end

И это тот класс, который я хочу внедрить, используя объект Owe…. но я не могу вызвать атрибут Owe.

module Roomate

type Roomate = class

val Name : string
val Owe: module.Owe   //Error!

new(name, owe) as this =
{
   Name = name
   Owe = owe
}
end

Я ценю любые советы или решения.

Заранее спасибо.

Эмма.

1 Ответ

3 голосов
/ 14 мая 2019

Возможно, вы получаете сообщение об ошибке, потому что module.Owe не является правильным способом ссылки на тип из другого модуля. Здесь вам не нужно ключевое слово module - вам просто нужно дать имя модуля и имя класса, как в <module-name>.<class-name>. В вашем случае, несколько запутанно, имя модуля и имя класса Owe, поэтому вы можете написать Owe.Owe.

Еще одна вещь, которую нужно иметь в виду, это то, что в F # порядок файлов имеет значение. Это означает, что вы можете ссылаться на классы только из файлов, которые появились ранее в вашем проекте.

Наконец, я бы также добавил, что довольно часто объявляется несколько типов в одном файле (и в одном модуле) в F #, поэтому вам не нужно перемещать определения в отдельные файлы. Я бы также рекомендовал использовать синтаксис lightweitght для объявления классов с использованием неявных конструкторов:

type Owe(name:string, amount:float) = 
  member x.Name = name
  member x.Amount = amount

type Roomate(name:string, owe:Owe) =
  member x.Name = name
  member x.Owe = owe

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

type Owe = { Name:string; Amount:float }
type Roomate = { Name:string; Owe:Owe }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...