Невозможно заимствовать неизменяемое содержимое `Box`` ** it` как изменчивое при циклировании по вектору с полиморфными признаками [duplicate]

== сравнивает ссылки на объекты.

.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() всегда лучше.

6
задан Shepmaster 8 January 2018 в 00:28
поделиться

1 ответ

Вам нужно иметь изменяемую ссылку на каждый элемент. 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 не отслеживает эти вещи через границы функций, поэтому вам нужно разделить все остальные переменные-члены и передать их отдельно для функции.

См. Также:

2
ответ дан Shepmaster 16 August 2018 в 14:36
поделиться
  • 1
    & quot; неизменна ссылка на измен ющуюс " Ааа, это часть, которую мне не хватало. И в отношении ссылок на себя: это означает, что если мне нужно будет какое-либо изменение состояния себя, мне нужно сделать это с телом цикла for. Правильно ли я это понял? – Tomo 2 May 2016 в 21:15
  • 2
    @Tomo Обновлен ответ, а не идеальное решение. Надежда, что кто-то другой может предложить что-то лучше. – Arjan 2 May 2016 в 21:44
  • 3
    Да, это выглядит уродливо. :) – Tomo 2 May 2016 в 21:46
  • 4
    @Tomo Если вы не более конкретны в этой проблеме, вы, вероятно, не сможете добиться большего успеха. Если вы произвольно одалживаете self, вы даете разрешение на неограниченные изменения. Тем не менее, можно сделать красивее, чем два swap s . – Veedrac 3 May 2016 в 05:33
  • 5
    @Veedrac Я не знаю, нужно ли мне изменять состояние Worker. - спросил я из любопытства. Спасибо за трюк mem::replace, хорошо иметь его в моем ящике инструментов. – Tomo 3 May 2016 в 06:44
Другие вопросы по тегам:

Похожие вопросы: