==
сравнивает ссылки на объекты.
.equals()
сравнивает значения String.
Иногда ==
дает иллюзии сравнения значений String, как в следующих случаях:
String a="Test";
String b="Test";
if(a==b) ===> true
Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:
(a == b) ===> true
String Pool
b -----------------> "test" <-----------------a
Однако ==
не выполняется в следующем случае:
String a="test";
String b=new String("test");
if (a==b) ===> false
В этом случае для new String("test")
оператор new String будет создан в куче, и эта ссылка будет указана на b
, поэтому b
будет дана ссылка на кучу, а не на String pool.
Теперь a
указывает на String в пуле String, а b
указывает на String в куче. Из-за этого мы получаем:
, если (a == b) ===> false.
String Pool
"test" <-------------------- a
Heap
"test" <-------------------- b
Пока .equals()
всегда сравнивает значение String, поэтому дает true в обоих случаях:
String a="Test";
String b="Test";
if(a.equals(b)) ===> true
String a="test";
String b=new String("test");
if(a.equals(b)) ===> true
Таким образом, использование .equals()
всегда лучше.
Вам нужно иметь изменяемую ссылку на каждый элемент. iter
возвращает неизменяемые ссылки. И неизменяемая ссылка на изменяемую переменную сама по себе не изменчива. Вместо этого используйте iter_mut
или for task in &mut self.tasks
.
Затем, проще всего сделать, чтобы встроить work_one
в work
:
pub fn work(&mut self) {
for task in self.tasks.iter_mut() {
task.do_it()
}
}
К сожалению, расщепление этого на две функции довольно болезненно. Вы должны гарантировать, что вызов self.work_one
не изменит self.tasks
. Rust не отслеживает эти вещи через границы функций, поэтому вам нужно разделить все остальные переменные-члены и передать их отдельно для функции.
См. Также:
for
. Правильно ли я это понял? – Tomo 2 May 2016 в 21:15self
, вы даете разрешение на неограниченные изменения. Тем не менее, можно сделать красивее, чем дваswap
s . – Veedrac 3 May 2016 в 05:33Worker
. - спросил я из любопытства. Спасибо за трюкmem::replace
, хорошо иметь его в моем ящике инструментов. – Tomo 3 May 2016 в 06:44