【发布时间】:2016-04-10 00:18:42
【问题描述】:
我想从System.IO.BinaryWriter 派生一个类,并使用自定义Stream 调用它的构造函数,其实现捕获派生类型的构造函数参数。对于我的一生,我根本无法弄清楚这是否可能。我基本上想要做的,稍微修剪成 MCV,是
type HashingBinaryWriter private
(hasher : System.Security.Cryptography.HashAlgorithm,
stream : System.IO.Stream) =
inherit System.IO.BinaryWriter(stream)
let unsupp() = raise(System.NotSupportedException())
let hash_stream =
{ new System.IO.Stream() with
member __.CanRead = false
member __.CanSeek = false
member __.CanWrite = true
member __.Length = unsupp()
member __.Position with get() = unsupp() and set(_) = unsupp()
member __.Seek(_,_) = unsupp()
member __.SetLength _ = unsupp()
member __.Read(_,_,_) = unsupp()
member __.Flush() = ()
member __.Write(buffer, offset, count) =
hasher.TransformBlock(buffer, offset, count, null, 0) |> ignore
}
new(hasher) = new HashingBinaryWriter(hasher, hash_stream)
// Or, alternatively
new(hasher) as me = new HashingBinaryWriter(hasher, me.hash_stream)
最后一行无法编译,因为hash_stream 未定义,无论是哪种形式。显然,正如this answer 所暗示的,构造函数参数的范围与类声明主体的范围不同,但我需要了解这里发生了什么(如果可能的话,还有 F# 设计决策背后的原因)。
确实,我可以看到一些解决方法(例如,将 hash_stream 转换为私有属性),但是我的 F# 习语词汇表中缺少这个。那么,我的第二个问题是,这样做的惯用方式是什么。
【问题讨论】:
-
我怀疑惯用的方法是使
hash_stream成为以hasher作为参数的顶级绑定 -
@JohnPalmer:有道理,谢谢。
标签: f#