Rust Lifetime, что я делаю неправильно? [Дубликат]

Как сказал @Veger, вы можете сделать его final, чтобы переменная могла использоваться во внутреннем классе.

final ViewPager pager = (ViewPager) findViewById(R.id.fieldspager);

Я назвал его pager, а не mPager, потому что вы используют его как локальную переменную в методе onCreate. Префикс m зарезервирован для переменных класса (т.е. переменных, объявленных в начале класса и доступных для всех методов класса).

Если вам действительно нужна переменная-член класса, он не работает, чтобы сделать его окончательным, потому что вы не можете использовать findViewById, чтобы установить его значение до onCreate. Решение состоит в том, чтобы не использовать анонимный внутренний класс. Таким образом, переменная mPager не обязательно должна быть объявлена ​​окончательной и может использоваться во всем классе.

public class MainActivity extends AppCompatActivity {

    private ViewPager mPager;
    private Button mButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...

        mPager = (ViewPager) findViewById(R.id.fieldspager);

        // ...

        mButton.setOnClickListener(myButtonClickHandler);
    }


    View.OnClickListener myButtonClickHandler = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mPager.setCurrentItem(2, true);
        }
    };
}
9
задан Shepmaster 22 April 2017 в 13:53
поделиться

2 ответа

Этот раздел веб-сайта Серда подробно описывает границы Deserialize.


Существует два основных способа записи границ атрибутов Deserialize, независимо от того, блок impl или функция или где-либо еще.

  • <'de, T> where T: Deserialize<'de> Это означает, что «T можно десериализовать с некоторого времени жизни». Вызывающий получает решение о том, что такое жизнь. Обычно это используется, когда вызывающий объект также предоставляет данные, которые десериализуются, например, в функции, подобной serde_json::from_str . В этом случае входные данные также должны иметь время жизни 'de, например, это может быть &'de str.
  • <T> where T: DeserializeOwned Это означает, что «T можно десериализовать из любого времени жизни». Вызванный получает решение, какое время жизни. Обычно это происходит из-за того, что данные, которые десериализуются, будут выброшены до того, как функция вернется, поэтому T не может быть разрешено заимствовать у нее. Например, функция, которая принимает данные с кодировкой base64 в качестве входных данных, декодирует ее из base64, десериализует значение типа T, а затем отбрасывает результат декодирования base64. Другим распространенным применением этой функции является функция десериализации из потока ввода-вывода, например serde_json::from_reader . Чтобы сказать это более технически, признак DeserializeOwned эквивалентен оценке более высокого ранга for<'de> Deserialize<'de>. Единственная разница в DeserializeOwned более понятна для чтения. Это означает, что T владеет всеми данными, которые десериализуются.
4
ответ дан dtolnay 20 August 2018 в 07:01
поделиться

Я нашел ответ из вопроса Serde 891 : я должен использовать DeserializeOwned вместо Deserialize.

9
ответ дан Shepmaster 20 August 2018 в 07:01
поделиться
Другие вопросы по тегам:

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