私は錆に慣れていて、私は借用チェッカーにいくつか問題があります。なぜこのコードがコンパイルされないのか分かりません。申し訳ありませんが、これは以前に答えられた質問に近いですが、私が見た他の質問で解決策を見つけることができないようです。文字列スライスのベクトルを返すことができません:借りた値が十分に長く生きていません
私はReturn local String as a slice (&str)との類似点を理解していますが、その場合はただ1つの文字列が返され、ベクターを返そうとしている私のコードで私が推論するのに十分ではありません。私が理解したところでは、私はstr
型への参照を返すようにしています。これは、関数ブロックの最後にスコープから外れるので、&str
のベクトルをString
のベクトルにマッピングする必要がありますか?私は、&str
をString
に変換することによるパフォーマンスの影響については心配していません。まず、私はそれを働かせたいです。
これはコードです。エラーはlex
機能にあります。ここで
use std::io::prelude::*;
use std::fs::File;
use std::env;
fn open(mut s: &mut String, filename: &String) {
let mut f = match File::open(&filename) {
Err(_) => panic!("Couldn't open file"),
Ok(file) => file,
};
match f.read_to_string(&mut s) {
Err(_) => panic!("Couldn't read file"),
Ok(_) => println!("File read successfully"),
};
}
fn lex(s: &String) -> Vec<&str> {
let token_string: String = s.replace("(", " (")
.replace(")", ") ");
let token_list: Vec<&str> = token_string.split_whitespace()
.collect();
token_list
}
fn main() {
let args: Vec<_> = env::args().collect();
if args.len() < 2 {
panic!("Please provide a filename");
} else {
let ref filename = args[1];
let mut s = String::new();
open(&mut s, filename);
let token_list: Vec<&str> = lex(&s);
println!("{:?}", token_list);
}
}
は錆の経験の私のレベルで、私はこれらの変数の寿命を視覚化することができないので、私はそれは難しい、このコードを理由に探していたエラーメッセージ
error: borrowed value does not live long enough
self.0.borrow().values.get(idx)
^~~~~~~~~~~~~~~
reference must be valid for the anonymous lifetime #1 defined on the block at 23:54...
pub fn value(&self, idx: usize) -> Option<&Value> {
^
note: ...but borrowed value is only valid for the block at 23:54
pub fn value(&self, idx: usize) -> Option<&Value> {
^
です。私はこれを理解しようと1〜2時間を費やしたので、どんな助けにも感謝します。
他の「xは十分に長くは生きていません」というスタックオーバーフローの質問を見たことがありますか? 'lex'関数に新しい' String'を作成し、その 'String'が' lex'関数よりも古くても参照を返すようにしています。 –
関数外の文字列を定義して、可変参照を渡す必要がありますか、関数内で定義された文字列の寿命を延長して 'lex'関数よりも長生きできる方法はありますか? –
あなたは永遠に生涯を延長することはできません。私はあなたの問題に対する解決策を持っていますが、重複としてマークしたくない場合は、質問を変更する必要があります。それは所有されたオブジェクトへの参照を返す方法を尋ねる他のすべての質問とは異なる理由を扱うべきです。 –