Advertisement

《Elixir In Action》第一章--第五章笔记

阅读量:

目录

一.iex 文件名

二. 关于返回值

三. 库的载入

1. import

2. alias 库名, as: 你喜欢的名字

3. alias 库名

四. @符号

1. 定义模块内常量

2. 编写文档

3. 特化函数输入输出的类型。

五. 类型系统

1. Numbers

Extra(待详细补充!!!!!!)

2. Atoms

Extra

总结


前言

个人备忘录。以免发生突然忘记什么语法下又要查文档还要查半天屁都没找到最后只能重新翻书的情况。

一.iex 文件名

能直接编译指定文件到iex上进行交互。

二. 关于返回值

Elixir默认函数体最后一行为其返回值,如果为函数,那么返回函数的结果,而不是返回函数本身。

三. 库的载入

1. import

直接把整个库load进来,库名都给你扬了。(不用写库名就能直接调用对应的函数)

2. alias 库名, as: 你喜欢的名字

换个名字load进来。调用需要以“你喜欢的名字 . 函数名”形式调用。

3. alias 库名

也是整个load进来,但是不写as的话,会默认为库名的以点分割的最后的字段。

如 alias Geometry.Rectangle, 那么调用时候库名就是Rectangle

四. @符号

1. 定义模块内常量

根据书上所写,此为定义Module attribute(库的属性?)操作符。一般而言,用起来像C语言的宏.

@pi 3.14, 那么整个模块里所有pi都为3.14。(仅限模块内!!!!别他妈以为这是个全局变量)

2. 编写文档

除此以外,对于Elixir的模块的一些固有属性也能进行定义。

复制代码
 defmodule HelloFuckingWorld do

    
   @moduledoc "There is no fucking world"
    
  
    
   @doc "Hello World!"
    
   def hello_world do
    
     IO.puts("Hello world!")
    
   end
    
 end

这个很重要! Elixir某种程度上来说可以算得上面向文档编程。

@moduledoc 允许敲代码的记录关于此模块的信息(干哈用啊, 有啥函数啊, 怎么想的啊)。

@doc 允许敲代码的记录关于此函数的信息。(干哈用啊, 怎么想的啊)

拥有相关字段的库可以在 iex 中,用 “h 模块名”/“h 模块名**.** 函数名”的形式进行查阅。

(所以遇到不知道的函数,先iex里h一下,能解决大部分问题。)

3. 特化函数输入输出的类型。

复制代码
 defmodule Circle do

    
  
    
   @spec area(number) :: number
    
   def area(r), do: r*r*pi
    
 end

在没有@spec字段的时候, area函数可以接收一切值(然后报错)。@spec可以特化函数的输入输出的类型。其中一个好处是可以使其的错误由一开始的你不知道输入啥类型的报错变成输入不符合类型的报错。(犯错的一小步,加班的一大步)

五. 类型系统

1. Numbers

字面意思,int 和float 结合体。

复制代码
 4/2 == 2.0 #True

    
 div(3,2) == 1 #True
    
 rem(3,2) == 1 #True
    
 1_000_000 == 1000000 #True

莫名奇妙的“/"符号,给的是浮点数。div, rem 就不多说了, 懂的都懂。

1_000_000,莫名其妙的语法糖,允许你数字像英文的数字写法那样1,000,000。

Extra(待详细补充!!!!!!)

这玩意儿有个很邪门的特性,就是整数大小是没有上限的,你写99位9的整数也是完全ok的。真的很邪门,需要参考erlang的相关内存分配规则。

另外,浮点要么是32bits,要么是64bits, 底层表示为IEEE 754-1985格式(我也不知道是啥,待查阅)

2. Atoms

没啥好说。

还是说说吧。

这玩意儿和上文提到的alias有关。

复制代码
    AnAtom == :"Elixir.AnAtom" #true

定义Atoms时,除了常规的冒号:加任意数字字母和下划线以外,还有种写法是:"atoms",这种写法允许写所有字符(吧)。

在代码块里,我们可以看到左边的字符是没有冒号在前面的,但是根据右边的字符,我们可以判断出,AnAtom是一个Atom。

换句话来说,Atoms还有一种写法是直接开头大写字母,这被称为alias。

那么这里面有什么乾坤呢?

复制代码
 AnAtom == Elixir.AnAtom #true

    
 Elixir.AnAtom == :"Elixir.AnAtom" #true
    
 alias IO, as MyIO

当你写下一个alias,等价于你告诉你编译器, 在编译的时候请把这个Atom变成前面加Elixir.的一个完整的Atom。

当你使用alias 模块名,as 你喜欢的名字的时候,等价于你告诉编译器,在编译的时候把你喜欢的名字替换为Elixir.模块名的Atom。

没错,模块名和函数名也是Atoms!

复制代码
 :true == true #true

    
 :false == false #true

更离谱的事儿来了,Elixir里,布尔型居然他妈的也是Atoms。

高,实在是高。

所以Atom怎么实现的?(好像底层还是个整数?)

Extra

另外提一句,在Elixir里经常会看到一些函数后面带个问号的。不要以为这是什么奇怪的语法,这是因为Elixir允许函数名加问号的而已,没啥好奇怪的。不过,一般而言,这类带问号的函数返回的值均为布尔型,所以经常看到以下代码

复制代码
    database_value = connection_established? && read_data

自己领会啥意思。(提示:或并运算不会直接计算所有值哦,而是一个一个算的)

(再给个提示吧,或并运算并不是返回布尔型,而是返回一个表达式,当没有合法表达式时候,返回最后一个值)

(待续)


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

全部评论 (0)

还没有任何评论哟~