有没有办法从静态成员访问let绑定字段?以下给出了指示的错误:
type Foo(x) =
let x = x
static member test() =
let foo = Foo(System.DateTime.Now.Month)
printfn "%A" foo.x //the field, constructor or member 'x' is not defined
()
Run Code Online (Sandbox Code Playgroud)
私有显式字段允许从静态成员访问:
type Bar =
val private x:int
new(x) = { x=x }
static member test() =
let Bar = Bar(System.DateTime.Now.Month)
printfn "%A" Bar.x
()
Run Code Online (Sandbox Code Playgroud)
文档http://msdn.microsoft.com/en-us/library/dd469494.aspx声明"显式字段不适合日常使用",但从静态成员访问私有实例字段当然是一种常规方案.此外,我不相信您可以在主构造函数中设置显式字段,这意味着如果需要从静态成员访问一个私有实例字段,则必须将所有字段移动到显式字段,并且您不能再使用主要构造函数 - 它是全有或全无.
作为真实想要从静态成员访问私有实例字段的实际示例,请考虑一个大整数实现:BigInteger类是不可变的,因此大整数的内部表示将保留为私有实例字段(让我们叫它data).现在,假设您认为Add(other)实例方法不适合不可变数据结构,并且您只想实现静态Add(lhs,rhs)方法:在这种情况下,您需要能够访问lhs.data和rhs.data.
假设我有以下Domain类:
class Book {
String title
String author
byte[] largeCoverArtImage
}
Run Code Online (Sandbox Code Playgroud)
我有一个列表视图,我不需要显示largeCoverArtImage,如何使用GORM Criteria执行以下SQL查询?
select title, author from Book
Run Code Online (Sandbox Code Playgroud) 作为这个问题的后续,我想知道是否有可能将模块中的F#函数(可能是通过属性)标记为Intellisense中的"隐藏".回顾一下,我有一些标记的函数,inline但是根据我不想公开的其他函数实现.因此,虽然实现函数必须保持公开(因为它们被内联),但我记得在过去我遇到过隐藏在Visual Studio Intellisense中的C#方法,但如果你知道它们是什么就编译得很好,但是我不记得确切的方法,我不确定这是某种特殊的Visual Studio事物还是一种可用的功能,如DebuggerBrowsable(DebuggerBrowsableState.Never)意识.
更新:我尝试应用EditorBrowsable(EditorBrowsableState.Never)但它似乎不适用于Visual F#项目.
我想从c#中的方法返回多个参数.我只是想知道哪个更好或者是元组?
static void Split (string name, out string firstNames, out string lastName)
{
int i = name.LastIndexOf (' ');
firstNames = name.Substring (0, i);
lastName = name.Substring (i + 1);
}
static Tuple<string,string> Split (string name)
{
//TODO
}
Run Code Online (Sandbox Code Playgroud) I have an async computation like the following (see inline comments):
async {
//...
do! Async.Sleep(100) //cancellation may happen during sleep
//... but isn't checked at the end of the sleep, so regular, non-async computations are executed here
}
Run Code Online (Sandbox Code Playgroud)
In order to force a cancellation check/terminate the entire async computation before the "regular" computation part is reached, I insert an effective no-op do! Async.Sleep(1) immediately after the do! Async.Sleep(100). Is there a cleaner way to do this? Possibly even …
我正在尝试使用mysqldump导出需要使用不同数据库名称导入的数据库.查看mysqldump生成的SQL,看起来触发器是唯一一个完全符合源数据库名称的对象名称,从而扼杀了我的需求.反正有没有指导mysqldump没有完全限定任何对象名称,包括触发器?
我最近变得有点自满地写了像
printf "\n%f\n" 3.2
Run Code Online (Sandbox Code Playgroud)
代替
printf "%s%f%s" Environment.NewLine 3.2 Environment.NewLine
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有办法像第一个版本一样编写安全的第二个版本(即格式字符串中的一个特殊字符,它插入Environment.Newline以便不需要格式字符串中每个换行符实例的参数)?
我正在考虑使用一个抽象类与所有抽象成员而不是接口,以避免显式接口实现样板代码.而不是
type IMyInterface =
abstract Name : string
abstract Text : string
type MyClass() =
member __.Name = "name"
member __.Text = "text"
interface IMyInterface with
member this.Name = this.Name
member this.Text = this.Text
Run Code Online (Sandbox Code Playgroud)
我有
[<AbstractClass>]
type MyAbstractClass() =
abstract Name : string
abstract Text : string
type MyClass() =
inherit MyAbstractClass()
override __.Name = "name"
override __.Text = "text"
Run Code Online (Sandbox Code Playgroud)
我应该在这里注意任何谨慎或含义的话语?
我刚刚阅读了Krzysztof Cwalina和Brad Abrams的框架设计指南第二版中关于扩展成员的部分,并没有找到这样的例子.我的问题涉及F#库中的超类和子类,但我希望答案与所有.NET语言相关.
F#有两种类型,super类型Expr和sub类型Expr<'a>,后者只是前者的类型化版本的包装器.这些是用于引用表达式的类型.
如果我想在这些类型上定义扩展方法以进行评估,那么这将是一个更好的设计:
EvalUntyped() : Expr -> obj上Expr和Eval() : Expr<'a> -> 'a上Expr<'a>.Eval() : Expr -> obj在Expr与Eval() : Expr<'a> -> 'a上Expr<'a>.第二个选项对我来说似乎更正确,但是我想遵循可能存在的任何设计准则:是否有任何权威优先权(假设它们在PowerPack中"错误")?
有可用的 vim 模式吗iex?也就是说,类似于set -o vibash 中的东西。
这是我的版本信息:IEx 1.13.0 (compiled with Erlang/OTP 24)
我正在运行它Linux Mint 20.2 Uma。
f# ×6
.net ×1
asynchronous ×1
c# ×1
c#-4.0 ×1
database ×1
elixir ×1
elixir-iex ×1
grails ×1
grails-orm ×1
hibernate ×1
mysql ×1
mysqldump ×1