我在书中某处读到,不可变字符串可以比可变字符串更有效地实现。
与 Changeable 相比,Immutable String 如何更高效?
我的意思是不可变字符串和可变字符串之间的实现差异是什么,使不可变字符串更高效......?
什么时候可以,什么时候不能调用可变变量?
int/float/bool 值非常清楚。但是,比方说,数组呢?mutable如果我要向它添加元素,我可以调用 native array吗?与std::vector.
再举一个例子。我有对象 A,它保持对另一个对象 B 的引用 (B & b)。对象 B 有我将重新分配的本机数组/ std::vector (我认为在这种特殊情况下是类似的)。伪代码:
struct B{
std::vector<int> arr;
// int *arr; //Or this
void changeArr(){
arr.push_back(90);
}
}
struct A{
A(B &b) : b(b){};
mutable B &b; // is it ok to have it "mutable"?
//mutable B b; // or even this?
void fire() const{
b.arr.push_back(125);
// Or
b.changeArr();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以调用B &b可变的吗?
更新
根据http://en.cppreference.com/w/cpp/language/cv:
可变 - 定义类的成员不影响类的外部可见状态。
这是什么externally …
当我进行声纳扫描时,我得到了“不应直接存储或返回可变成员”的漏洞。在提到我们应该克隆可变对象或返回不可修改列表的地方也提供了解决方案。但是,如果我克隆了对象,然后如果我想更新值,那么我如何访问原始对象,因为我已经返回了克隆对象?对此的任何想法将不胜感激。提前致谢
我试图sums: Vec<i64>在迭代时修改一个可变的。循环代码如下:
for (j, &mut sum) in sums.iter_mut().enumerate() {
if !(j == i) {
sum += n;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
for (j, &mut sum) in sums.iter_mut().enumerate() {
if !(j == i) {
sum += n;
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎完全神秘。Rust 允许我可变地借用sumfrom sums,但编译器阻止我实际修改它。省略.enumerate()甚至不会改变产生的错误代码。
我想知道如何修复循环。
这可能是重复的问题,但我仍然对此感到好奇。
我想在没有 numpy 的情况下用 Python 制作二维列表。所以我列出了清单。这是我的代码:
myList = [None] * 3
print('myList :', myList)
myMatrix = [myList] * 3
#myMatrix = [[None, None, None], [None, None, None], [None, None, None]]
print('myMatrix', myMatrix)
for i in range (0,3):
for j in range (0, 3):
myMatrix[i][j] = i+j
print('myMatrix[',i,'] : ', myMatrix[i])
print(myMatrix)
print(myMatrix[0])
print(myMatrix[1])
print(myMatrix[2])
Run Code Online (Sandbox Code Playgroud)
我知道声明:
myMatrix = [myList] * 3
Run Code Online (Sandbox Code Playgroud)
使代码无法按预期工作,这是因为 list 是可变对象,这意味着 myMatrix[0]、myMatrix[1]、myMatrix[2] 将引用同一个对象。对它们中的任何一个进行更改都意味着对所有这些更改,这不是我在代码中所期望的。这是我的代码的意外输出:
('myList :', [None, None, None])
('myMatrix', [[None, None, None], [None, None, None], [None, None, None]]) …Run Code Online (Sandbox Code Playgroud) 我正在使用# frozen_string_literal: trueRuboCop 默认强制执行的神奇注释,并且我无法向字符串附加某些内容:
string = 'hello'
string << ' world'
Run Code Online (Sandbox Code Playgroud)
因为它出错了:
无法修改冻结字符串 (RuntimeError)
我知道在 python 中,从 -5 到 256 的整数可以具有相同的 ID。但是,如果两个不可变对象具有相同的 ID,会有什么后果呢?当两个可变对象具有相同的 ID 时,后果如何?
谢谢你。
基本上我想要做的是如果你按下按钮然后条目应该得到一个新的 CEntry。如果有人可以帮助我就好了。谢谢!
struct AView: View {
var entries = [CEntries]()
var body: some View {
ZStack {
VStack {
Text("Hello")
ScrollView{
ForEach(entries) { entry in
VStack{
Text(entry.string1)
Text(entry.string2)
}
}
}
}
Button(action: {
self.entries.append(CEntries(string1: "he", string2: "lp")) <-- Error
}) {
someButtonStyle()
}
}
}
Run Code Online (Sandbox Code Playgroud)
}
class CEntries: ObservableObject, Identifiable{
@Published var string1 = ""
@Published var string2 = ""
init(string1: String, string2: String) {
self.string1 = string1
self.string2 = string2
}
}
Run Code Online (Sandbox Code Playgroud) 假设有一个带有属性列表的类 A:
class A {
val list = mutableListOf<String>()
fun addAText() {
list.add("a text")
}
}
Run Code Online (Sandbox Code Playgroud)
但现在不仅方法addAText()可以将字符串添加到列表中,而且来自世界各地的每个人都可以。
所以我将上面的代码重写为:
class A {
private val mutList = mutableListOf<String>()
val list: List<String>
get() = mutList
fun addAText() {
mutList.add("a text")
}
}
Run Code Online (Sandbox Code Playgroud)
那么问题是:有更好的方法吗?像任何语法支持或标准 kotlin 库一样?额外的私有属性似乎不是一个优雅的解决方案。
在x用于填充时如何避免列出所有字段input?
struct StructX {
a: u32,
b: u32,
}
trait TraitY {
fn foo(info: &mut StructX) -> bool;
}
impl TraitY for SomeZ {
fn foo(input: &mut StructX) -> bool {
let mut x = StructX { /*....*/ };
// do something with x, then finally:
input.a = x.a;
input.b = x.b;
}
}
Run Code Online (Sandbox Code Playgroud)
在 C++ 中它只是input = x,但这在 Rust 中不起作用。请注意,这是一个“接口”,因此我无法将 的类型更改为其他类型input。