2017-04-17 9 views
1

私は単純なインタプリタをRustで作成しようとしています。ここにコードスニペットがあります。ベクトルから要素を返すときのエラーE0495

use std::vec::Vec; 
use std::option::Option; 
use std::borrow::Borrow; 

trait Data {} 

trait Instruction { 
    fn run(&self, stack: &mut Vec<Box<Data>>) -> Option<&Data>; 
} 

struct Get { 
    stack_index: usize, 
} 

impl Instruction for Get { 
    fn run(&self, stack: &mut Vec<Box<Data>>) -> Option<&Data> { 
     Some(stack[self.stack_index].borrow()) 
    } 
} 

fn main() {} 

上記は単純なGet命令を含んでいます。これはrunメソッドを持ち、単にDataというスタックから値を返します。 Dataは、本当にどんなタイプのデータでも表す抽象的な特性です。私はまだDataを実装していません。しかし、コードをコンパイル

は、私が何をしないのですE0495

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements 
    --> <anon>:17:14 
    | 
17 |   Some(stack[self.stack_index].borrow()) 
    |    ^^^^^^^^^^^^^^^^^^^^^^^ 
    | 
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 16:63... 
    --> <anon>:16:64 
    | 
16 |  fn run(&self, stack: &mut Vec<Box<Data>>) -> Option<&Data> { 
    | ________________________________________________________________^ starting here... 
17 | |   Some(stack[self.stack_index].borrow()) 
18 | |  } 
    | |_____^ ...ending here 
note: ...so that reference does not outlive borrowed content 
    --> <anon>:17:14 
    | 
17 |   Some(stack[self.stack_index].borrow()) 
    |    ^^^^^ 
note: but, the lifetime must be valid for the anonymous lifetime #1 defined on the body at 16:63... 
    --> <anon>:16:64 
    | 
16 |  fn run(&self, stack: &mut Vec<Box<Data>>) -> Option<&Data> { 
    | ________________________________________________________________^ starting here... 
17 | |   Some(stack[self.stack_index].borrow()) 
18 | |  } 
    | |_____^ ...ending here 
note: ...so that expression is assignable (expected std::option::Option<&Data>, found std::option::Option<&Data>) 
    --> <anon>:17:9 
    | 
17 |   Some(stack[self.stack_index].borrow()) 
    |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

エラーコードを生成しますか?

答えて

3

What is the return type of the indexing operation on a slice?で説明したように、stack[self.stack_index]は値でスライス内の値を返しています。次に、ローカル変数への参照を返します。これは、Is there any way to return a reference to a variable created in a function?で説明されているように許可されていません。

実際にSome(&*stack[self.stack_index])としたい場合、Boxを逆参照してDataになるようにしてから、再度参照してください。

fn run<'a>(&self, stack: &'a mut Vec<Box<Data>>) -> Option<&'a Data> 

は、私はおそらくかかわらずgetmapを使用してそれを実装したい::

stack.get(self.stack_index).map(Box::as_ref) 
実装が lifetime elisionためのルールに適合していないので、あなたはあなたの形質方法と実装に明示的な寿命を追加する必要があります
+0

お返事ありがとうございます!しかし、私が正しく理解していれば、[これはうまくいかない:/](https://play.rust-lang.org/?gist=2dc89d594443628eb548d5e75e1fcfc3&version=stable&backtrace=0) – Abogical

+0

@Abogicalあなたは[特性定義を変更する必要がありますと実装](https://play.integer32.com/?gist=d619b6bbc9a32a0755cc4aa7f80cdbe3&version=stable);私は答えのその点を明確にしました。 – Shepmaster

+0

ああ、ダムの間違いで申し訳ありません、ありがとう! – Abogical

関連する問題