Enum、Stream

Enum

  其常见用法见:https://cloud.tencent.com/developer/section/1116852

  在sort时,如果要获得稳定的排序结果,要使用<= 而不是 <。

 

Stream

  Stream是延迟处理的,而Enum是贪婪的,则意味着传给它一个收集,它会默默计算那个收集的所有内容。如:

[ 1, 2, 3, 4, 5]
|> Enum.map(&(&1 * &1))
|> Enum.with_index
|> Enum.map( fn {value, index} -> value - index end )
|> IO.inspect        #=> [ 1, 3 ,7, 13, 21 ]
    #第一个map函数接受原始列表并生成一个新列表,其元素值是原来的平方。...如此下去最终生成了四个列表

s = Stream.map [ 1, 3, 5, 7 ], &(&1 + 1)     #s不是一个列表
Enum.to_list s        #这样使用 => [ 2, 4, 6 ,8 ]

#我们通常这样写
[ 1, 2, 3, 4 ]
|> Stream.map(&(&1 * &1))
|> Stream.map(&(&1 + 1))
|> Stream.filter( fn x -> rem(x, 2) == 1 end )            #rem求余
|> Enum.to_list        #转化为我们可见的    

  使用Stream没有中间结果,但是运行速度慢了两倍。适用于数据抵达的慢,但一直持续。使用Enum要等到所有数据到达后才能开始处理。使用流,只有有数据抵达就可以进行处理。

 

自定义流

  Stream.cycle。它接受一个枚举类型参数,并返回一个包含该枚举类型参数元素的无限流。当到达结尾时会从头开始

Stream.cycle(~w{ green white })
|> Enum.take(5)        #green white green white green

  Stream.repeatedly。接受一个函数,在需要更新时调用该函数

  Stream.iterate。Stream.iterate( start_value, next_fun )生成一个无限流,第一个值是start_value,下一个值是调用next_fun函数以第一个值为参数生成的。

Stream.iterate(0, &(&1 + 1)) |> Enum.take(5)        #[ 0, 1, 2, 3, 4]

  Stream.unfold。使用前两个参数计算下一个值

Stream.unfold({0 ,1}, fn (f1, f2) -> {f1, {f2, f1 + f2}} end )
|> Enum.take(8)
    #[ 0, 1 ,1, 2, 3, 5, 8, 13 ]

   Stream.resource。现在需要在流开始的时候才创建/读取数据,而在流结束的时候需要关闭数据。Stream.resource第一个参数接受一个函数,它会返回值。第二个参数也是接受一个函数,函数接受第一个函数的返回值。第三个参数函数关闭相关资源。

Stream.resource(fn -> File.open("sample") end, 
                        fn file -> 
                            case IO.read(file, :line) do
                                line when is_binary(line) -> { [line], file }
                                _ -> { :halt, file }
                            end
                        end,
                        fn file -> File.close!(file) end )

 

推导式

for x <- [1, 2, 3, 4, 5], do: x * x

for x <- [1, 2, 3, 4, 5], x < 4, do: x * x

  如果有两个生成器,则它们的操作是嵌套的。

for x <- [1, 2], y <- [5, 6], do: {x, y}        #[ {1, 5}, {1, 6}, {2, 5}, {2, 6} ]

  后面的生成器可以使用前面的变量。

min_maxes = [{1, 4}, {2, 3}, {10, 15}]
for {min, max} <- min_maxes, n <- min..max, do: n
    #[1, 2, 3, 4, 2, 3 ,10, 11, 12, 13, 14, 15]

  例(使用了两个生成器和过滤器)。

first8 = [1, 2, 3, 4, 5, 6, 7, 8]
for x <- first8, y <- first8, x >= y, rem(x*y, 10) == 0, do: {x, y}    #x >= y 防止出现{2, 5}、{5, 2}

 

  推导式处理二进制。推导式中的变量只在其内部有效。

for << ch <- "hello >>, do: ch        #返回的是列表[104, 101, 108, 108, 111]  iex显示为 'hello'
for << ch <- "hello" >>, do: <<ch>>        #将编码转换为字符串  ["h", "e", ... ]

  推导式的返回值可以被into 改变。

for x <- ~w{ cat dog }, into: Map.new, do: { x, String.upcase(x) }        # %{"cat" => "CAT", "dog" => "DOG" }

 

转载于:https://www.cnblogs.com/lr1402585172/p/11498748.html

### 枚举类型在C++中的基本概念 在C++中,`enum` 是一种用于定义一组命名整数常量的关键字。通过使用 `enum` 类型,可以提高代码的可读性和维护性。传统的枚举类型是从 C 继承而来的,但在现代 C++ 中引入了 **scoped enums** 或称为 **强类型枚举 (enum class)** 来解决传统枚举的一些缺陷。 #### 传统枚举 传统枚举会将枚举值注入到其作用域之外,这可能导致名称冲突。例如: ```cpp // Traditional Enum Example enum Color { red, green, blue }; ``` 在此例子中,`red`, `green`, 和 `blue` 成为了全局范围内的标识符[^1]。 #### 强类型枚举 (`enum class`) 为了避免上述问题并增强安全性,C++11 引入了 `enum class`。它具有更强的作用域控制能力,并且不会污染外部命名空间。以下是它的典型用法: ```cpp // Scoped Enum Example enum class Direction : char { north = 'N', south = 'S', east = 'E', west = 'W' }; void printDirection(Direction dir) { switch(dir) { case Direction::north: std::cout << "North"; break; case Direction::south: std::cout << "South"; break; case Direction::east: std::cout << "East"; break; case Direction::west: std::cout << "West"; break; } } ``` 这里需要注意的是,在访问 `enum class` 的成员时,必须显式指定所属的枚举类名,比如 `Direction::north` 而不是简单的 `north`。 #### 使用场景举例 标准库广泛采用了这种技术来处理各种错误码映射以及状态指示器等问题。例如 `<system_error>` 头文件提供了基于系统的错误码支持;而在内存管理方面,则有指针安全性的标志位设置等等。 另外还有关于输入/输出流操作可能遇到的情况描述如下所示: ```cpp #include <iostream> #include <iosfwd> int main() { try { throw std::io_errc::stream; } catch(const std::errc& e){ if(e == std::io_errc::stream){ std::cerr<<"Stream Error Occurred!"<<std::endl; } } return 0; } ``` 此段程序展示了如何利用预定义好的 IO 错误类别来进行异常捕捉与相应处理逻辑编写工作流程之一部分实现方式。 最后值得一提的是,尽管某些开发者可能会怀念过去没有这些高级特性之前的日子,但从长远来看,采用像运算符重载、异常机制及模板这样的现代化工具无疑让编程变得更加愉快高效[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值