Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf8207ed

Browse files
committed
fix code quoting
1 parent10154b4 commitf8207ed

File tree

1 file changed

+37
-39
lines changed

1 file changed

+37
-39
lines changed

‎12-io.md

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
======
33

44
本章简单介绍Elixir的输入、输出机制,文件系统相关的任务,
5-
以及涉及到的模块,如[```IO```](http://elixir-lang.org/docs/stable/elixir/IO.html)
6-
[```File```](http://elixir-lang.org/docs/stable/elixir/File.html)
7-
[```Path```](http://elixir-lang.org/docs/stable/elixir/Path.html)
5+
以及涉及到的模块,如[`IO`](http://elixir-lang.org/docs/stable/elixir/IO.html)
6+
[`File`](http://elixir-lang.org/docs/stable/elixir/File.html)
7+
[`Path`](http://elixir-lang.org/docs/stable/elixir/Path.html)
88

99
我们曾经在早期的文章中说现在介绍IO似乎有点早。
1010
但是,我们注意到IO系统其实提供了一窥Elixir和虚拟机的设计哲学和精妙的绝佳机会。
1111

1212
>“早期的文章”:现在介绍I/O似乎有点早,但是I/O系统可以让我们一窥Elixir哲学,满足我们对该语言以及VM的好奇心。
1313
14-
##```IO```模块
14+
##`IO`模块
1515

16-
```IO```模块提供了Elixir语言中读写标准输入/输出(```:stdio```)、
17-
标准错误(```:stderr```)、文件和其他IO设备的主要机制。
16+
模块`IO`提供了Elixir语言中读写标准输入/输出(`:stdio`)、
17+
标准错误(`:stderr`)、文件和其他IO设备的主要机制。
1818

1919
该模块的使用方法颇为直白:
2020

@@ -36,9 +36,9 @@ iex> IO.puts :stderr, "hello world"
3636
:ok
3737
```
3838

39-
##```File```模块
39+
##`File`模块
4040

41-
```File```模块包含的函数可以让我们打开文件作为IO设备。
41+
`File`模块包含的函数可以让我们打开文件作为IO设备。
4242
默认情况下文件是以二进制模式打开,
4343
它要求程序员使用特定的```IO.binread/2``````IO.binwrite/2```函数来读写文件:
4444

@@ -53,7 +53,7 @@ iex> File.read "hello"
5353
{:ok,"world"}
5454
```
5555

56-
文件可以使用```:utf8```编码方式打开,这让```File```模块以UTF-8编码方式解析文件中读取的字节:
56+
文件可以使用`:utf8`编码方式打开,这让`File`模块以UTF-8编码方式解析文件中读取的字节:
5757

5858
```elixir
5959
iex> {:ok, file}=File.open"another", [:write,:utf8]
@@ -62,13 +62,13 @@ iex> {:ok, file} = File.open "another", [:write, :utf8]
6262

6363
除了打开、读写文件的函数,文件模块还提供了许多函数来操作文件系统。
6464
这些函数根据Unix平台上功能相对应的命令来命名。
65-
```File.rm/1```用来删除文件,```File.mkdir/1```用来创建目录,
66-
```File.mkdir_p/1```创建目录并保证其父目录一并创建。
67-
甚至还有```File.cp_r/2``````File.rm_rf/1```用来递归地复制或删除整个目录。
65+
`File.rm/1`用来删除文件,`File.mkdir/1`用来创建目录,
66+
`File.mkdir_p/1`创建目录并保证其父目录一并创建。
67+
甚至还有`File.cp_r/2``File.rm_rf/1`用来递归地复制或删除整个目录。
6868

69-
你会注意到```File```模块的函数有两种变体,一个普通的和一个名称末尾有```!```(bang)的。
70-
例如在上面的例子里,我们在读取“hello”文件时,用的是不带```!```的版本。
71-
相对地,我们也可以使用```File.read!/1```
69+
你会注意到`File`模块的函数有两种变体,一个普通的和一个名称末尾有`!`(bang)的。
70+
例如在上面的例子里,我们在读取“hello”文件时,用的是不带`!`的版本。
71+
相对地,我们也可以使用`File.read!/1`
7272

7373
```elixir
7474
iex>File.read"hello"
@@ -98,7 +98,7 @@ end
9898
{:ok, body}=File.read(file)
9999
```
100100

101-
当遇到文件不存在的情况时,函数返回```{:error, reason}```,然后导致在跟左侧元祖做模式匹配时失败。
101+
当遇到文件不存在的情况时,函数返回`{:error, reason}`,然后导致在跟左侧元祖做模式匹配时失败。
102102
失败依然会抛出一个异常,但是该异常的错误信息是描述一次模式匹配失败,而不是文件的什么错误。
103103
从而在一定程度上掩盖了真正的失败原因。
104104

@@ -119,9 +119,9 @@ File.read!(file)
119119

120120
##```Path```模块
121121

122-
```File```模块中的绝大多数函数都以各种路径作为参数
122+
模块`File`中的绝大多数函数都以各种路径作为参数
123123
通常,这些路径都是二进制串(binaries)。
124-
```Path```模块提供了操作这些路径的函数
124+
模块`Path`提供了操作这些路径的函数
125125

126126
```elixir
127127
iex>Path.join("foo","bar")
@@ -130,8 +130,8 @@ iex> Path.expand("~/hello")
130130
"/Users/jose/hello"
131131
```
132132

133-
推荐使用```Path```模块提供的函数而不是直接手动操作代表路径的二进制串。
134-
因为```Path```模块考虑了不同操作系统的区别,使得各种处理是对“操作系统”透明的。
133+
推荐使用`Path`模块提供的函数而不是直接手动操作代表路径的二进制串。
134+
因为`Path`模块考虑了不同操作系统的区别,使得各种处理是对“操作系统”透明的。
135135
最后,记住在Windows平台上处理文件操作时,Elixir会自动将斜杠(/)转换成反斜杠(\)。
136136

137137
有了上面介绍的模块和函数,我们已经能对文件系统进行基本的操作。
@@ -140,15 +140,15 @@ iex> Path.expand("~/hello")
140140

141141
##进程(Processes)和组长(group leaders)
142142

143-
你可能已经注意到```File.open/2```函数返回类似```{:ok, pid}```的元祖:
143+
你可能已经注意到`File.open/2`函数返回类似`{:ok, pid}`的元祖:
144144

145145
```elixir
146146
iex> {:ok, file}=File.open"hello", [:write]
147147
{:ok,#PID<0.47.0>}
148148
```
149149

150-
```IO```模块实际上是和进程(Process)一起协同工作的。
151-
当你调用```IO.write(pid, binary)```时,```IO```模块将发送一条消息给```pid```标示的进程,
150+
模块`IO`实际上是和进程(Process)一起协同工作的。
151+
当你调用`IO.write(pid, binary)`时,`IO`模块将发送一条消息给`pid`标示的进程,
152152
附上所期望进行的操作。
153153

154154
如果我们自己用进程来描述这个过程:
@@ -163,11 +163,11 @@ iex> IO.write(pid, "hello")
163163
** (ErlangError) erlangerror::terminated
164164
```
165165

166-
调用```IO.write/2```之后,可以看到```IO```模块发出的请求(四个元素的元祖)被打印了出来。
167-
不久后,因为我们并未提供```IO```模块期待的某种结果,这个请求失败了。
166+
调用`IO.write/2`之后,可以看到`IO`模块发出的请求(四个元素的元祖)被打印了出来。
167+
不久后,因为我们并未提供`IO`模块期待的某种结果,这个请求失败了。
168168

169-
[```StringIO```模块](http://elixir-lang.org/docs/stable/elixir/StringIO.html)
170-
提供了基于字符串的```IO```设备消息处理功能(将字符串看做IO设备):
169+
[`StringIO`模块](http://elixir-lang.org/docs/stable/elixir/StringIO.html)
170+
提供了基于字符串的`IO`设备消息处理功能(将字符串看做IO设备):
171171

172172
```elixir
173173
iex> {:ok, pid}=StringIO.open("hello")
@@ -179,7 +179,7 @@ iex> IO.read(pid, 2)
179179
Erlang虚拟机通过利用进程给IO设备建模,使得同一个网络中的不同节点可以通过交换文件进程,
180180
实现跨节点的文件读写。而在所有IO设备之中,有一个特殊的进程,称作*组长(group leader)*
181181

182-
当你写东西到标准输入输出(```:stdio```),实际上是发送了一条消息给进程组长,
182+
当你写东西到标准输入输出(`:stdio`),实际上是发送了一条消息给进程组长,
183183
它把内容写给标准输出的文件描述符:
184184

185185
```elixir
@@ -194,15 +194,15 @@ hello
194194
在不同的应用场景下,让哪个进程作为组长是可以配置的。
195195
例如,当在远程终端执行代码时,通过配置组长,可以使得远程节点上打印的消息可以被重定向到发起操作(你)的终端上。
196196

197-
##```iodata``````chardata```
197+
##`iodata``chardata`
198198

199199
在以上所有例子中,我们都用的是二进制串格式写入文件。
200200
在“二进制串、字符串和字符列表”那章里,我们提到过字符串(string)就是普通的bytes,
201201
而字符列表(char list)就是字符编码(code point,如“Uxxxx”、“049”)的列表。
202202

203-
```IO```模块和```File```模块中的函数还可以接受列表作为参数。
204-
不光如此,它们还接受混合类型的列表,里面内容可以是列表(如```'ab c'```)、
205-
整形(如```49``````?A``` --- 返回65)和二进制串(如```"ab c"```):
203+
`IO`模块和`File`模块中的函数还可以接受列表作为参数。
204+
不光如此,它们还接受混合类型的列表,里面内容可以是列表(如`'ab c'`)、
205+
整形(如`49``?A` --- 返回65)和二进制串(如`"ab c"`):
206206

207207
```elixir
208208
iex>IO.puts'hello world'
@@ -213,18 +213,16 @@ hello world
213213
:ok
214214
```
215215

216-
>```?```返回后面字符的编码(code point),如```?A```默认情况下返回65。
216+
>`?`返回后面字符的编码(code point),如`?A`默认情况下返回65。
217217
218218
尽管如此,有些地方还是要注意。一个列表可能表示一串byte,或者一串字符。
219219
用哪一种需要看IO设备是怎么编码的。
220220
如果不指明编码,文件就以raw模式打开,
221-
这时候只能用```IO```模块里```bin*```开头(二进制版本)的函数对其进行操作。
222-
这些函数接受```iodata```作为参数。也就是说,它们期待一个整数值的列表,用来表示bytes或二进制串。
221+
这时候只能用`IO`模块里`bin*`开头(二进制版本)的函数对其进行操作。
222+
这些函数接受`iodata`作为参数。也就是说,它们期待一个整数值的列表,用来表示bytes或二进制串。
223223

224-
On the other hand,:stdio and files opened with:utf8 encoding work with the remaining functions in the IO module. Those functions expect a char_data as an argument, that is, a list of characters or strings.
225-
226-
另一边,使用```:utf8```打开的```:stdio```和文件使用```IO```模块里剩下来其它的函数。
227-
这些函数期待```char_data```作为参数,即一串字符或字符串的列表。
224+
另一边,使用`:utf8`打开的`:stdio`和文件使用`IO`模块里剩下来其它的函数。
225+
这些函数期待`char_data`作为参数,即一串字符或字符串的列表。
228226

229227
尽管差别比较精妙,但只是当你想要传递列表给那些函数的时候,才用担心一下细节问题。
230228
而二进制串(binaries)表示了底层的bytes字节列表,这种表示已经是raw的了。

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp