提交 ba11e301 编写于 作者: F feilong

add lifetime exercise2

上级 7b642af1
{
"type": "code_options",
"author": "幻灰龙",
"source": "helloworld.md",
"notebook_enable": true
"type": "code_options",
"author": "huanhuilong",
"source": "helloworld.md",
"notebook_enable": true,
"exercise_id": "6ee394e414ff4ca88dbd9e4bf0cee33d"
}
\ No newline at end of file
{
"type": "code_options",
"author": "maozhonggui",
"source": "historyofrust.md",
"notebook_enable": true
"type": "code_options",
"author": "maozhonggui",
"source": "historyofrust.md",
"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代码中,生命周期错误的选项
......
{
"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",
"keywords": [],
"children":[],
"export": [
"lifetime.json"
]
"keywords": []
}
\ No newline at end of file
{
"type": "code_options",
"author": "huanhuilong",
"source": "lifetime.md",
"notebook_enable": false
}
\ No newline at end of file
......@@ -330,7 +330,22 @@
"生命周期": {
"node_id": "rust-d38898d251df42d49f5f367f077ede55",
"keywords": [],
"children": []
"children": [
{
"函数生命周期": {
"node_id": "rust-7f73462bc1d54b52891a4c2fc84f2a19",
"keywords": [],
"children": []
}
},
{
"结构体生命周期": {
"node_id": "rust-f7b9ef1329c745959fb1ca56061b4ae5",
"keywords": [],
"children": []
}
}
]
}
},
{
......
......@@ -71,10 +71,6 @@ def check_export(base, cfg):
return flag
def gen_node_id():
return "oceanbase-" + uuid.uuid4().hex
class TreeWalker:
def __init__(self, root, tree_name, title=None, log=None):
self.name = tree_name
......@@ -107,7 +103,7 @@ class TreeWalker:
for index, section_node in enumerate(chapter_node["children"]):
section_title = list(section_node.keys())[0]
full_path = os.path.join(
chapter_path, f"{index}.{section_title}")
chapter_path, f"{index+1}.{section_title}")
if os.path.isdir(full_path):
self.ensure_exercises(full_path)
......@@ -123,7 +119,8 @@ class TreeWalker:
level_path = os.path.join(self.root, level)
num, config = self.load_level_node(level_path)
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]
return root_node
......@@ -149,7 +146,7 @@ class TreeWalker:
num, chapter = self.load_chapter_node(full_name)
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]
return level_node
......@@ -161,10 +158,21 @@ class TreeWalker:
num, section = self.load_section_node(full_name)
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]
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):
for subdir in os.listdir(self.root):
self.ensure_level_config(subdir)
......@@ -285,4 +293,4 @@ class TreeWalker:
exercise = load_json(full_name)
if "exercise_id" not in exercise:
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.
先完成此消息的编辑!
想要评论请 注册