再一次,我失去了一些时间,因为仅仅是愚蠢,这可能是编译器已经认识到的.这是有问题的源代码:
class f {
static int mVar;
int g(int x) { int mVar=3; return x+mVar; }
};
int f::mVar = 1;
Run Code Online (Sandbox Code Playgroud)
问题是,我不小心int在前面添加了mVar.当我编译它时:g++ -c -Wall -Wextra -Wshadow shadowtest.cpp我没有得到任何警告,关于mVar静态成员的本地阴影mVar.
但是如果我没有声明成员变量是静态的,那么g ++会正确地发出警告:
class f {
int mVar;
f(int rVar) : mVar(rVar) {};
int g(int x) { int mVar=3; return x+mVar; }
};
Run Code Online (Sandbox Code Playgroud)
用g++ -c -Wall -Wextra -Wshadow shadowtest2.cppgets 编译:
shadowtest2.cpp:5:24: warning: declaration of ‘mVar’ shadows a member of ‘f’ [-Wshadow]
int …Run Code Online (Sandbox Code Playgroud) 考虑下面的java代码:
class Enclosing {
void method(){}
void method(String str){}
class Inner {
void method(){}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在读一本书,告诉我Inner.method()将隐藏两个版本Enclosing.method(),这意味着如果我method(aString)在课堂上的某个地方打电话,这是一个错误Inner.
为什么语言设计如此?
更新:
根据@Debosmit Ray给出的答案,它与阴影有关.我已经阅读了文档,并了解它是什么.
令我困惑的是为什么方法阴影是基于方法名称而不是方法签名?
我已经介绍过,默认情况下,数据在F#中是不可变的.当我们将值重新赋值给某个变量时,真正发生的是它重新绑定变量的值,但设置新值是不同的事情.重新绑定称为阴影,而如果我们明确地没有说变量的值是可变的,则设置新值是不可能的.
任何人都可以详细解释这个概念吗?阴影(重新绑定)之间有什么区别
let var = "new_value"
Run Code Online (Sandbox Code Playgroud)
并设置新值
var <- "new_value"
Run Code Online (Sandbox Code Playgroud)
这是一个时刻,在重新绑定期间我们创建另一个对象并将该对象的地址分配给变量,而在第二个示例中我们更改值本身?我从堆/堆栈中了解了内存......我可能错了.
谢谢
我可以使用调试隐式的建议:
我想使用隐含的,x:
type T
trait HasT {
implicit def x: T = ...
}
Run Code Online (Sandbox Code Playgroud)
但我还需要从某个包中导入通配符foo.我尝试了两种不同的方式来介绍两者:
class UseT extends HasT {
import foo._
implicitly[T] // fails! "could not find implicit value"
// use foo stuff
}
Run Code Online (Sandbox Code Playgroud)
和
class UseT {
object hasT extends HasT
import hasT.x
import foo._
implicitly[T] // fails! "could not find implicit value"
}
Run Code Online (Sandbox Code Playgroud)
两者都失败了"找不到"(不是"模糊的含义值").
当x: T通过继承或导入在方法调用点访问隐式标识符时会发生这种情况.
我的解决方法是在导入之前将x重新绑定到隐式val.以下两项工作:
implicit val x2: T = implicitly[T]
import foo._
implicitly[T] // works!
Run Code Online (Sandbox Code Playgroud)
和
implicit val …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
<html><head></head>
<body>
<script type="text/javascript">
var outside_scope = "outside scope";
function f1() {
alert(outside_scope) ;
}
f1();
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
此代码的输出是警报框显示消息"外部范围".但是,如果我稍微修改代码为:
<html><head></head>
<body>
<script type="text/javascript">
var outside_scope = "outside scope";
function f1() {
alert(outside_scope) ;
var outside_scope = "inside scope";
}
f1();
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
警告框显示消息" 未定义 ".如果在两种情况下都显示"未定义",我本可以理解逻辑.但是,这种情况并没有发生.它仅在第二种情况下显示"未定义".为什么是这样?
在此先感谢您的帮助!
我想了解阴影和嵌套函数的机制是如何工作的.例如:
let func y =
let dup y = y + y
let z = dup y
let dup y =
let dup z =
let y = y * z
y
let z = y
y
dup z + z;;
val func : int -> int
> func 3;;
val it : int = 12
Run Code Online (Sandbox Code Playgroud)
有人可以解释这里发生了什么吗
我知道F#中的变量默认是不可变的.但是,例如在F#interactive中:
> let x = 4;;
val x : int = 4
> let x = 5;;
val x : int = 5
> x;;
val it : int = 5
>
Run Code Online (Sandbox Code Playgroud)
所以,我将4分配给x,然后将5分配给x并且它正在改变.这是对的吗?它应该给出一些错误或警告吗?或者我只是不明白它是如何工作的?
我想__init__.py通过以下方式为我的包的文件中的另一个函数分配另一个函数:
llen = len
len = lambda x: llen(x) - 1
Run Code Online (Sandbox Code Playgroud)
它工作正常,但只在__init__.py文件中.如何让它影响我的包中的其他模块?
我开始学习F#语言。我正在使用VS Community2017。F#4.5
我有一个关于阴影的问题。似乎对我不起作用。当我使用相同的名称绑定时,它会告诉“值'x'的重复定义”。代码有什么问题?
let x = "one"
let x = "second"
let x = "third"
Run Code Online (Sandbox Code Playgroud) 对我来说,隐藏现有的值,如:
阴影和嵌套函数
在F#
f中不可变#重复定义
FSharp,用于娱乐和利润评论
似乎违背了不变性和类型安全的概念,这使得F#如此强大.F#中的阴影效果与 C#中的不同.我花了很长时间才发现我的代码中的一个错误是由于在同一范围内无意中隐藏了一个名称.有没有办法让VS中的阴影值有编译器警告?
我知道在某些情况下它可能很有用.例如,Checked Aritmetics.