Как создать запись с некоторыми локальными частными функциями в F # - PullRequest
1 голос
/ 06 декабря 2010
type SQLConn =
    val mutable private connection  : string option

    member this.Connection
        with get() : string   = this.connection.Value
        and  set(v)           = this.connection           <- Some v

    new (connection : string) = {connection = Some connection;}
    new() = SQLConn @"Data Source=D:\Projects\AL\Service\ncFlow\dbase\dbflow.db3; Version=3;Password=432432434324"

Я хочу использовать там "let x = 5 + 5" или что-то в этом роде, так как я могу использовать частные функции в своем типе (классе) (записи), я знаю, что могу использовать их, если ясделать SQLConn (), но тогда я не могу использовать val, я хочу использовать оба: val и let ...

спасибо

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

Как объясняет Тим, вы можете использовать только локальные привязки let с неявным синтаксисом конструктора. Я определенно следовал бы этому подходу, поскольку он делает код F # более читабельным.

У вас есть какая-то конкретная причина, по которой вы также хотите использовать val в своем коде? Вы все еще можете использовать их с неявным синтаксисом конструктора, но они должны быть изменяемыми и инициализироваться с помощью мутации:

type SQLConn(connection:string) as x = 
  let mutable connection = connection

  // Declare field using 'val' declaration (has to be mutable)
  [<DefaultValue>]
  val mutable a : int 

  // Initialize the value imperatively in constructor
  do x.a <- 10

  member this.Connection 
    with get() = connection and set(v) = connection <- v 

  new() = SQLConn @"Data Source=.." 

Насколько я могу сказать, val требуется только для создания полей, которые не являются частными (что может требоваться некоторыми инструментами на основе кода, такими как ASP.NET, но в остальном не очень полезно).

2 голосов
/ 06 декабря 2010

Сообщение об ошибке объясняет проблему:

ошибка FS0963: привязки 'let' и 'do' недопустимы в определениях классов, если не используется неявная последовательность построения.Вы можете использовать неявную последовательность построения, изменив объявление типа для включения аргументов, например, 'type X (args) = ...'.

В сообщении об ошибке предлагается объявить свой класс как type SQLConn(connection) =.Если вы сделаете это, вам, вероятно, следует удалить свойство member this.Connection, поскольку у вас больше не будет изменяемого поля.

Более вероятным обходным решением будет объявить x как val x : int, а затем поставитьx = 5 + 5; инициализатор внутри вашего конструктора.

1 голос
/ 06 декабря 2010

А как насчет следующего?

type SQLConn(conn:string) =
  // could put some other let bindings here... 
  // ex: 'let y = 5 + 5' or whatever
  let mutable conn = conn
  new() = SQLConn(@"some default string")
  member __.Connection 
    with get () = conn and set v = conn <- v
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...