Это вопрос о более раннем классе Persistence
, который я пытался выставить в качестве перечислителя. Я понял, что мне нужно передать ссылку действительно, чтобы изменить значение объекта, который я пытаюсь заполнить. Наверное, я собираюсь сделать это на C++-пути (поскольку большинство, возможно, догадалось, что я начинаю F #). Тем не менее, я хочу быть настолько эффективным с точки зрения печати в памяти, насколько смогу. В идеале я хотел бы повторно использовать один и тот же объект снова и снова, когда читаю из файла.IEnumerator in F # continue
У меня возникла проблема с этим кодом, где он не позволяет мне передавать по ссылке в вызове функции serialize
. Я снова воспроизвожу код здесь. Я заранее благодарю вас за вашу помощь.
Я получаю ошибку:
error FS0001: This expression was expected to have type
byref<'T>
but here has type'T
Если изменить вызов serialize(& current_, reader_)
я получаю следующее сообщение об ошибке:
persistence.fs(71,6)
: error FS0437: A type would store abyref
typed value. This is not permitted by Common IL.
persistence.fs(100,29)
: error FS0412: A type instantiation involves abyref
type. This is not permitted by the rules of Common IL.
persistence.fs(100,30)
: error FS0423: The address of the fieldcurrent_
cannot be used at this point
КОД:
type BinaryPersistenceIn<'T when 'T: (new : unit -> 'T)>(fn: string, serializer: ('T byref * BinaryReader) -> unit) =
let stream_ = File.Open(fn, FileMode.Open, FileAccess.Read)
let reader_ = new BinaryReader(stream_)
let mutable current_ = new 'T()
let eof() =
stream_.Position = stream_.Length
interface IEnumerator<'T> with
member this.Current
with get() = current_
member this.Dispose() =
stream_.Close()
reader_.Close()
interface System.Collections.IEnumerator with
member this.Current
with get() = current_ :> obj
member this.Reset() =
stream_.Seek((int64) 0., SeekOrigin.Begin) |> ignore
member this.MoveNext() =
let mutable ret = eof()
if stream_.CanRead && ret then
serializer(current_, reader_)
ret
Вам действительно нужно иметь это как класс? Как насчет моего предложения с выражением вычисления 'seq' из вашего предыдущего вопроса? http://stackoverflow.com/a/30128698/180286 –
AAH Я не заметил вашего подхода, ориентированного на последовательность ... Позвольте мне проверить это. –
@Fyodor, причина, по которой я не использовал идею stream/sequence, заключается в том, что я не хотел выделять структуру каждый раз. Я читаю базу данных тика, и с течением времени она замедляет чтение. –