問題是:私有函數vs嵌套函數
何時使用私有函數以及何時使用嵌套函數? (我問F#但也許答案可以在其他功能的語言有關)
一個小例子
namespace SomeName
module BinaryReaderExt =
open System.IO
let seek (reader : BinaryReader) positions =
reader.BaseStream.Seek(positions, SeekOrigin.Current) |> ignore
module Mod =
open System.IO
let private prFun reader:BinaryReader =
//do something
BinaryReaderExt.seek reader 10L
let outerFun (stream :System.IO.Stream) =
let reader = new System.IO.BinaryReader(stream)
let seek = BinaryReaderExt.seek reader
let nestedFun() =
seek 10L
//do something
nestedFun()
prFun reader
這是一個巨大的獎賞,即在嵌套函數可以從更高的範圍內使用的數據。也不污染周圍的模塊。但看起來很笨拙,不是嗎?特別是當有一些大的嵌套功能
相反,私人功能可以公開並被測試。看起來它們看起來更具可讀性
你的意見是什麼?
在真正的代碼中看到'let private'非常少見 - 我認爲使用私有方法創建類型會比較普遍 – 2013-04-07 06:41:24
我同意'let private'不是很常見,但我認爲可能僅僅是因爲F#的傳統功能。我其實很喜歡'讓私人',並發現它非常有用(當私人功能是一個獨立的功能)。 – 2013-04-07 13:26:57
私人模塊功能的一個刺激...當試圖在F#Interactive中運行它們時...我得到這個「錯誤FS1094:'myPrivateFunction'的值無法從此代碼位置訪問。我必須刪除'private',將函數添加到F#Interactive中,並記得在完成時替換'private'。 – Wally 2015-03-26 18:04:13