use*_*081 10 f# f#-interactive
在F#interactive中,如何查看此会话中定义的变量/函数列表?像whos()python或ls()R中的函数一样?谢谢.
Tom*_*cek 17
您可以使用.NET Reflection实现此功能 - 局部变量和函数在单个动态程序集中定义为类型的静态属性/方法.您可以通过调用GetExecutingAssembly(在FSI本身中)获取该程序集,然后浏览类型以查找所有合适的属性.
以下是获取局部变量的合理工作函数:
open System.Reflection
open System.Collections.Generic
let getVariables() =
let types = Assembly.GetExecutingAssembly().GetTypes()
[ for t in types |> Seq.sortBy (fun t -> t.Name) do
if t.Name.StartsWith("FSI_") then
let flags = BindingFlags.Static ||| BindingFlags.NonPublic |||
BindingFlags.Public
for m in t.GetProperties(flags) do
yield m.Name, lazy m.GetValue(null, [||]) ] |> dict
Run Code Online (Sandbox Code Playgroud)
这是一个例子:
> let test1 = "Hello world";;
val test1 : string = "Hello world"
> let test2 = 42;;
val test2 : int = 42
> let vars = getVariables();;
val vars : System.Collections.Generic.IDictionary<string,Lazy<obj>>
> vars.["test1"].Value;;
val it : obj = "Hello world"
> vars.["test2"].Value;;
val it : obj = 42
Run Code Online (Sandbox Code Playgroud)
该函数返回"延迟"值(因为这是编写它的最简单的方法,而不预先读取所有变量的值会很慢),因此您需要使用该Value属性.还要注意你object回来了 - 因为F#类型系统无法知道类型 - 你必须动态地使用它.您可以通过迭代来获取所有名称vars...
| 归档时间: |
|
| 查看次数: |
2111 次 |
| 最近记录: |