我从RFC 246知道这一点:
- 常数声明常数值。这些代表一个值,而不是一个内存地址。这是我们目前所知的几乎所有情况下可以达到并取代
static
的最普遍的东西。- 静态声明全局变量。这些代表一个内存地址。它们将很少使用:主要用例是全局锁,全局原子计数器以及与旧版C库的接口。
当我尝试维护表格时,我不知道两者之间到底有什么区别。
我应该选择哪个?
答案 0 :(得分:8)
Rust中的const
变量是不可变的。您既不能重新分配也不能修改它:
struct Foo(u32);
const FOO: Foo = Foo(5);
fn main() {
FOO = Foo(1); //illegal
FOO.0 = 2; //illegal
}
一个static
变量 是可变的,因此可以修改或重新分配。请注意,编写/修改全局static
变量是不安全的,因此需要一个unsafe
块:
struct Foo(u32);
static FOO: Foo = Foo(5);
static mut FOO_MUT: Foo = Foo(3);
fn main() {
unsafe {
FOO = Foo(1); //illegal
FOO.0 = 2; //illegal
FOO_MUT = Foo(1);
FOO_MUT.0 = 2;
}
}
编译二进制文件时,所有const
“出现次数”(在源代码中使用const
的地方)都将直接由该值替换。
static
在二进制文件中将放置一个专用部分( BSS部分,有关详细信息,请参见Where are static variables stored in C and C++?)。
总而言之,请尽可能坚持使用const
。如果不可能,因为稍后需要在程序中使用非const
方法初始化变量,请使用lazy_static!
。
答案 1 :(得分:4)
static
vs const
const
:
static
之类的地址static
:
示例:
static CDF: i32 = 100;
const ABC: i32 = 50;
fn main() {
println!("{}", CDF); // compiler will put in a load instruction here for the static address
println!("{}", ABC); // compiler will put the value 50 here directly
// statics can be mutable
static mut HI: &str = "hi";
// however using mut static is unsafe
unsafe {
HI = "HITHERE";
}
unsafe {
println!("{}", HI);
}
}
答案 2 :(得分:3)
如果您不希望更改变量,则实际差异不大。
常量在编译时会内联,这意味着它们会被复制到所使用的每个位置,因此通常效率更高,而静态变量是指内存中的唯一位置,更像是全局变量。
常量是...常量,而静态变量虽然仍然是全局变量,但可以是可变的。
答案 3 :(得分:-1)
<!DOCTYPE html>
<html>
<head>
<title>practise</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="wrapper">
<section id="head">
<div class="container">
<header>Holiday <span>resort</span></header>
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="index.html">About Us</a></li>
<li><a href="index.html">Services</a></li>
</ul>
</div>
</section>
</div>
</body>
</html>
的主要目的是允许函数控制内部值,该内部值可在调用之间记住,但不能由主应用程序代码访问。与其他语言中的实例变量不同,它类似于类变量。 C和PHP以及许多其他语言也有这个概念。
示例:您想跟踪一个函数被调用多少次,并有一种复位内部计数器的方法:
function showJahresZahlen() {
for (var i = 0; i < data.length - 0; i++) {
xPos = map(data[i].longitude, (0 - 180), 180, 0, paperWidth);
yPos = paperHeight - map(data[i].latitude, (0 - 90), 90, 0, paperHeight);
if (data[i].lastEruption < 100) {
var circleColor = "blue"
} else if (data[i].lastEruption > 1000 && data.lastEruption < 1500) {
var circleColor = "red"
} else {
var circleColor = "orange"
}
data[i].circle.animate({
cx: xPos,
cy: yPos,
fill: circleColor,
}, 2000);
};