提交 ba11e301 编写于 作者: F feilong

add lifetime exercise2

上级 7b642af1
{ {
"type": "code_options", "type": "code_options",
"author": "幻灰龙", "author": "huanhuilong",
"source": "helloworld.md", "source": "helloworld.md",
"notebook_enable": true "notebook_enable": true,
"exercise_id": "6ee394e414ff4ca88dbd9e4bf0cee33d"
} }
\ No newline at end of file
...@@ -2,5 +2,6 @@ ...@@ -2,5 +2,6 @@
"type": "code_options", "type": "code_options",
"author": "maozhonggui", "author": "maozhonggui",
"source": "historyofrust.md", "source": "historyofrust.md",
"notebook_enable": true "notebook_enable": true,
"exercise_id": "7e6ebda86d1e44b7974f719f08c24c7e"
} }
\ No newline at end of file
{
"node_id": "rust-7f73462bc1d54b52891a4c2fc84f2a19",
"keywords": [],
"children": [],
"export": [
"lifetime.json"
]
}
\ No newline at end of file
{
"type": "code_options",
"author": "huanhuilong",
"source": "lifetime.md",
"notebook_enable": false,
"exercise_id": "526a3ad38c9a4f38af213e5d243c0e9e"
}
\ No newline at end of file
# Rust 函数的生命周期 # Rust 函数的生命周期(I)
选出以下Rust代码中,生命周期错误的选项 选出以下Rust代码中,生命周期错误的选项
......
{
"node_id": "rust-f7b9ef1329c745959fb1ca56061b4ae5",
"keywords": [],
"children": [],
"export": [
"lifetime_struct.json"
]
}
\ No newline at end of file
{
"type": "code_options",
"author": "huanhuilong",
"source": "lifetime_struct.md",
"notebook_enable": false,
"exercise_id": "64a2ddc560a54f588e62e5730883df38"
}
\ No newline at end of file
# 结构体里的生命周期(I)
以下对Rust结构体生命周期使用中,正确的代码是哪一项?
## 答案
```rust
struct Piece<'a>{
slice:&'a [u8] // 表明slice是来自外部对象的一个借用,'a只是一个生命周期形参
}
// Piece的定义里面,'a 表示vec的生命周期,
// 下面的例子调用,vec的生命周期至少应该大于等于piece的生命周期
// 简单说vec存活的作用域应该大于等于piece的存活作用域
fn test(){
let vec = Vec::<u8>::new();
let piece = Piece{slice: vec.as_slice()};
}
```
## 选项
### 结构体内含有的引用变量,函数返回后,生命周期就结束了
```rust
struct Piece<'a>{
slice:&'a [u8] // 表明slice是来自外部对象的一个借用,'a只是一个生命周期形参
}
fn test_2()->Piece{
let vec = Vec::<u8>::new();
let piece = Piece{slice: vec.as_slice()};
piece // compile error: ^^^^^ returns a value referencing data owned by the current function
}
```
### expected named lifetime parameter
```rust
struct Piece{
slice:& [u8] // 表明slice是来自外部对象的一个借用,'a只是一个生命周期形参
}
// Piece的定义里面,'a 表示vec的生命周期,
// 下面的例子调用,vec的生命周期至少应该大于等于piece的生命周期
// 简单说vec存活的作用域应该大于等于piece的存活作用域
fn test(){
let vec = Vec::<u8>::new();
let piece = Piece{slice: vec.as_slice()};
}
```
### 结构体内持有的变量应该在构建的时候存活
```rust
struct Piece<'a>{
slice:&'a [u8] // 表明slice是来自外部对象的一个借用,'a只是一个生命周期形参
}
fn test(){
let vec
{
vec = Vec::<u8>::new();
}
let piece = Piece{slice: vec.as_slice()};
}
```
{ {
"node_id": "rust-d38898d251df42d49f5f367f077ede55", "node_id": "rust-d38898d251df42d49f5f367f077ede55",
"keywords": [], "keywords": []
"children":[],
"export": [
"lifetime.json"
]
} }
\ No newline at end of file
{
"type": "code_options",
"author": "huanhuilong",
"source": "lifetime.md",
"notebook_enable": false
}
\ No newline at end of file
...@@ -330,9 +330,24 @@ ...@@ -330,9 +330,24 @@
"生命周期": { "生命周期": {
"node_id": "rust-d38898d251df42d49f5f367f077ede55", "node_id": "rust-d38898d251df42d49f5f367f077ede55",
"keywords": [], "keywords": [],
"children": [
{
"函数生命周期": {
"node_id": "rust-7f73462bc1d54b52891a4c2fc84f2a19",
"keywords": [],
"children": [] "children": []
} }
}, },
{
"结构体生命周期": {
"node_id": "rust-f7b9ef1329c745959fb1ca56061b4ae5",
"keywords": [],
"children": []
}
}
]
}
},
{ {
"高级类型": { "高级类型": {
"node_id": "rust-68bbd95834eb445083a8003ca624f907", "node_id": "rust-68bbd95834eb445083a8003ca624f907",
......
...@@ -71,10 +71,6 @@ def check_export(base, cfg): ...@@ -71,10 +71,6 @@ def check_export(base, cfg):
return flag return flag
def gen_node_id():
return "oceanbase-" + uuid.uuid4().hex
class TreeWalker: class TreeWalker:
def __init__(self, root, tree_name, title=None, log=None): def __init__(self, root, tree_name, title=None, log=None):
self.name = tree_name self.name = tree_name
...@@ -107,7 +103,7 @@ class TreeWalker: ...@@ -107,7 +103,7 @@ class TreeWalker:
for index, section_node in enumerate(chapter_node["children"]): for index, section_node in enumerate(chapter_node["children"]):
section_title = list(section_node.keys())[0] section_title = list(section_node.keys())[0]
full_path = os.path.join( full_path = os.path.join(
chapter_path, f"{index}.{section_title}") chapter_path, f"{index+1}.{section_title}")
if os.path.isdir(full_path): if os.path.isdir(full_path):
self.ensure_exercises(full_path) self.ensure_exercises(full_path)
...@@ -123,7 +119,8 @@ class TreeWalker: ...@@ -123,7 +119,8 @@ class TreeWalker:
level_path = os.path.join(self.root, level) level_path = os.path.join(self.root, level)
num, config = self.load_level_node(level_path) num, config = self.load_level_node(level_path)
levels.append((num, config)) levels.append((num, config))
levels.sort(key=lambda item: item[0])
levels = self.resort_children(self.root, levels)
root_node["children"] = [item[1] for item in levels] root_node["children"] = [item[1] for item in levels]
return root_node return root_node
...@@ -149,7 +146,7 @@ class TreeWalker: ...@@ -149,7 +146,7 @@ class TreeWalker:
num, chapter = self.load_chapter_node(full_name) num, chapter = self.load_chapter_node(full_name)
chapters.append((num, chapter)) chapters.append((num, chapter))
chapters.sort(key=lambda item: item[0]) chapters = self.resort_children(base, chapters)
level_node["children"] = [item[1] for item in chapters] level_node["children"] = [item[1] for item in chapters]
return level_node return level_node
...@@ -161,10 +158,21 @@ class TreeWalker: ...@@ -161,10 +158,21 @@ class TreeWalker:
num, section = self.load_section_node(full_name) num, section = self.load_section_node(full_name)
sections.append((num, section)) sections.append((num, section))
sections.sort(key=lambda item: item[0]) sections = self.resort_children(base, sections)
chapter_node["children"] = [item[1] for item in sections] chapter_node["children"] = [item[1] for item in sections]
return chapter_node return chapter_node
def resort_children(self, base, children):
children.sort(key=lambda item: item[0])
for index, [number, element] in enumerate(children):
title = list(element.keys())[0]
origin = os.path.join(base, f"{number}.{title}")
posted = os.path.join(base, f"{index+1}.{title}")
if origin != posted:
self.logger.info(f"rename [{origin}] to [{posted}]")
os.rename(origin, posted)
return children
def ensure_chapters(self): def ensure_chapters(self):
for subdir in os.listdir(self.root): for subdir in os.listdir(self.root):
self.ensure_level_config(subdir) self.ensure_level_config(subdir)
...@@ -285,4 +293,4 @@ class TreeWalker: ...@@ -285,4 +293,4 @@ class TreeWalker:
exercise = load_json(full_name) exercise = load_json(full_name)
if "exercise_id" not in exercise: if "exercise_id" not in exercise:
exercise["exercise_id"] = uuid.uuid4().hex exercise["exercise_id"] = uuid.uuid4().hex
dump_json(full_name, exercise) dump_json(full_name, exercise, True, True)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册