这可能是一件坏事,如在Java中的父级和子级类中讨论的具有相同的实例变量?.(如果父变量名称被更改怎么办?那么它将不再被遮蔽.)但是,我仍然好奇不同的静态/非静态变量是否会相互影响.一方面,我希望它们是相同的变量名称,因此将被遮蔽,但另一方面,似乎编译器可能基于静态区分这两者.
对我来说,隐藏现有的值,如:
阴影和嵌套函数
在F#
f中不可变#重复定义
FSharp,用于娱乐和利润评论
似乎违背了不变性和类型安全的概念,这使得F#如此强大.F#中的阴影效果与 C#中的不同.我花了很长时间才发现我的代码中的一个错误是由于在同一范围内无意中隐藏了一个名称.有没有办法让VS中的阴影值有编译器警告?
我知道在某些情况下它可能很有用.例如,Checked Aritmetics.
在F#编译器的同一范围内使用相同的变量两次时,没有警告或反馈.例如
let s = "abc"
let s = "def"
printfn "%A" s
Run Code Online (Sandbox Code Playgroud)
结果是
def
Run Code Online (Sandbox Code Playgroud)
我已经看到
有没有办法在Visual Studio中对F#中的值进行阴影警告?
F#值阴影 - 是否可以在同一范围内禁用值阴影
有没有办法通过编译器警告或在编辑器中可视化获得有关阴影变量的反馈.如何才能做到这一点?
当人们谈论F#时,他们有时会提到这个词top-level;
什么top-level意思?
例如在之前的SO Q&A中
错误FS0037有时,非常混乱
定义模块VS.NET与F#Interactive F#中
命名空间和模块之间的区别是什么?
F#
F#和MEF中的
AutoOpen属性:导出函数如何执行此F#函数
该术语也会在评论中定期出现,但对于那些问答我没有提及.
关于范围的维基百科文章涉及到这一点,但没有F#的具体细节.
F#3.x规范仅规定:
11.2.1.1函数和值的Arity一致性
括号表示一个
top-level函数,它可能是计算函数值的第一类计算表达式,而不是编译时函数值.
13.1自定义属性
例如,STAThread属性应该放在
top-level"do"语句之前.
14.1.8类型变量的名称解析
对于
top-level包含表达式和类型的任何成员或任何其他构造,它最初为空.
我怀疑这个术语在不同的语境中有不同的含义:范围,F#交互,阴影.
如果您还可以解释F#前身语言(ML,CAML,OCaml)的起源,我们将不胜感激.
最后,我不打算将答案标记为几天,以避免仓促答案.
简单的例子:
class Foo {
int x;
void bar(int x) {
[this]() -> void {
x = 6;
}();
}
};
Run Code Online (Sandbox Code Playgroud)
这不能在GCC,Clang,MVC或ICC上编译(请参见实时).如果我换void bar(int x)了void bar(int y),或者如果我换x = 6;到this->x = 6;那么它工作正常.
这对我来说没有意义.x来自调用的局部变量bar故意不在lambda中捕获.唯一x有意义的是Foo成员变量.
问题:这是预期的行为,如果是这样,请解释原因?
版本3.4.6和3.5.2之间的Python导入阴影似乎不同:
$ cat time.py
from time import time
$ pyenv global 3.4.6
$ python -V
Python 3.4.6
$ python time.py
Traceback (most recent call last):
File "time.py", line 1, in <module>
from time import time
File "/home/vagrant/tmp/time.py", line 1, in <module>
from time import time
ImportError: cannot import name 'time'
$ pyenv global 3.5.2
$ python -V
Python 3.5.2
$ python time.py
$ echo no error
no error
Run Code Online (Sandbox Code Playgroud)
问题1:为什么......那些东西?
问题2:更新日志中有什么内容吗?我找不到任何东西......
让我在房间的中心有一些网格(例如球体),充满立方体和一个光源.如何在OpenGL中使用"标准"(固定)功能进行快速简单的阴影投射?注意:结果必须包含立方体和球体阴影.
在F#powerpack数学提供程序源代码:我看到了这个(在lapack_service_netlib.fs)
member this.dgemm_((a:matrix),(b:matrix)) =
// allocate results
let c = Matrix.zero (m) (n)
// transpose
let c = Matrix.transpose c
...
// fixups
let c = Matrix.transpose c
// result tuple
c
Run Code Online (Sandbox Code Playgroud)
为什么这个有用?确实c有重复的定义?
基本上我想知道为什么静态方法不能被实例方法遮蔽,(我知道为什么,它会在某些情况下导致模糊),而静态变量可以被实例变量遮蔽(它只适用于子类) ).
例:
public class Apartment{
static int area = 10;
public static int getArea(){
return area;
}
}
class BedroomFlat extends Apartment {
int area = 10;// no problem at all
public int getArea(){ // illegal line it cannot hide the super static method
return area;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我尝试在超类中声明int area(实例变量)static int area它会产生错误,但是当在子类中声明时它不会发生,即使static int area从子类仍然可见.
尝试使用实例方法隐藏静态方法和尝试使用实例变量隐藏静态变量之间的行为方面的差异究竟是什么.
提前致谢.
有一些python代码可以在Linux下运行.它以这样的方式使用pwd模块:
import pwd
...
def func():
user=pwd.getpwnam(user)[2]
Run Code Online (Sandbox Code Playgroud)
现在我们有一个特定的需要用测试来覆盖这个代码,测试必须在Windows下运行.程序本身只能在Linux下运行.问题是pwd模块在Windows下不可用,因此即使使用MagicMock模拟了pwd函数的实现,受测试的代码也会因ImportError而失败.
解决此问题的基本思想是在运行测试时隐藏pwd模块.因此,当运行测试时,存根将影响pwd,并且在运行主程序时,将使用原始(Unix)pwd.我们在测试PYTHONPATH时创建了这样的存根:
# pwd.py
def getpwnam(user):
print("YESSSSSSSS")
Run Code Online (Sandbox Code Playgroud)
但它似乎没有影响一个pwd模块,在调试器中我们看到内置的pwd是导入的.我主要是一名Java开发人员,所以如果做事的方式不是"pythonic",我很抱歉.欢迎提出想法.