Scala作业(9)---模式匹配&&&高阶函数

2023-11-01

模式匹配

1、利用模式匹配,编写一个swap函数,接受一个整数的对偶,返回对偶的两个组成部件互换位置的新对偶

下面是使用模式匹配编写的 swap 函数,接受一个整数的对偶,返回对偶的两个组成部分互换位置的新对偶:

def swap(pair: (Int, Int)): (Int, Int) = pair match {
  case (a, b) => (b, a)
}

val pair = (3, 5)
val swappedPair = swap(pair)

println(swappedPair)  // 输出:(5, 3)

在上述代码中,我们定义了一个 swap 函数,它接受一个整数的对偶 (Int, Int) 作为参数,并使用模式匹配来提取对偶的两个组成部分 ab。然后,我们构造一个新的对偶 (b, a) 并返回。

在测试代码中,我们创建了一个整数对偶 (3, 5),然后调用 swap 函数来交换对偶中的两个元素。最后,我们打印出交换后的对偶 swappedPair,验证交换操作的正确性。

请注意,模式匹配的语法允许我们根据对偶的结构将其组成部分提取到变量中,从而进行操作和重构。

2、利用模式匹配,编写一个swap函数,交换数组中的前两个元素的位置,前提条件是数组长度至少为2

以下是使用模式匹配编写的 swap 函数,用于交换数组中的前两个元素的位置,前提条件是数组长度至少为2:

def swap(array: Array[Any]): Array[Any] = array match {
  case Array(a, b, rest @ _*) => Array(b, a) ++ rest
  case _ => array
}

val arr1 = Array(1, 2, 3, 4, 5)
val swappedArr1 = swap(arr1)
println(swappedArr1.mkString(", "))  // 输出:2, 1, 3, 4, 5

val arr2 = Array("a", "b", "c")
val swappedArr2 = swap(arr2)
println(swappedArr2.mkString(", "))  // 输出:b, a, c

val arr3 = Array(1)
val swappedArr3 = swap(arr3)
println(swappedArr3.mkString(", "))  // 输出:1

在上述代码中,我们定义了一个 swap 函数,它接受一个 Array[Any] 类型的数组作为参数,并使用模式匹配来匹配数组的结构。

如果数组的前两个元素分别为 ab,并且后续还有其他元素 rest,则返回一个新的数组,其中前两个元素位置已经交换,并连接上剩余的元素。

如果数组长度小于2或没有符合条件的模式匹配,则直接返回原数组。

在测试代码中,我们分别创建了三个不同类型的数组 arr1arr2arr3,并分别调用 swap 函数来交换前两个元素的位置。最后,我们打印出交换后的数组,以验证交换操作的正确性。

请注意,模式匹配的语法允许我们根据数组的结构提取其中的元素,并根据需要进行操作和重构。

3、编写一个函数,计算List[Option[Int]]中所有非None值之和。不得使用match语句。

以下是一个计算 List[Option[Int]] 中所有非 None 值之和的函数的实现,不使用 match 语句:

def sumNonNoneValues(list: List[Option[Int]]): Int = {
  list.flatMap(_.toList).sum
}

val list = List(Some(1), None, Some(2), None, Some(3))
val sum = sumNonNoneValues(list)
println(sum)  // 输出:6

在上述代码中,我们定义了一个名为 sumNonNoneValues 的函数,它接受一个 List[Option[Int]] 类型的列表作为参数。

首先,我们使用 flatMap 函数将列表中的 Option 值展平为一个列表,并使用 toList 方法将 Some 值转换为包含一个元素的列表,将 None 值转换为空列表。

然后,我们使用 sum 方法计算列表中所有非 None 值之和。

在测试代码中,我们创建了一个名为 list 的列表,其中包含了一些 Some 值和 None 值。然后,我们调用 sumNonNoneValues 函数来计算列表中所有非 None 值的和,并打印出结果。

请注意,使用 flatMap 函数可以将 Option 值展开并过滤掉 None 值,从而方便地进行操作和计算。

高阶函数

1、编写一个compose函数,将两个类型为Double=>Option[Double]的函数组合在一起,产生另一个同样类型的函数。如果其中一个函数返回None,则组合函数也应返回None。

例如:
def f(x : Double) = if ( x >= 0) Some(sqrt(x)) else None
def g(x : Double) = if ( x != 1) Some( 1 / ( x - 1)) else None
val h = compose(f,g)
h(2)将得到Some(1),而h(1)h(0)将得到None

下面是一个编写了 compose 函数的示例代码,用于将两个类型为 Double => Option[Double] 的函数组合在一起,产生另一个具有相同类型的函数。如果其中一个函数返回 None,则组合函数也会返回 None

def compose(f: Double => Option[Double], g: Double => Option[Double]): Double => Option[Double] = {
  x: Double =>
    f(x) flatMap g
}

val f: Double => Option[Double] = x => if (x >= 0) Some(math.sqrt(x)) else None
val g: Double => Option[Double] = x => if (x != 1) Some(1 / (x - 1)) else None

val h = compose(f, g)

println(h(2))  // 输出:Some(1)
println(h(1))  // 输出:None
println(h(0))  // 输出:None

在上述代码中,我们定义了两个函数 fg,它们分别具有类型 Double => Option[Double]。然后,我们定义了一个 compose 函数,它接受这两个函数作为参数,并返回一个新的函数,具有相同的类型。

compose 函数内部,我们首先将输入 x 应用于函数 f,得到一个 Option[Double]。然后,我们使用 flatMap 方法将其传递给函数 g,如果函数 f 返回 None,则整个组合函数将返回 None

在测试代码中,我们创建了一个名为 h 的组合函数,使用 compose 函数将函数 fg 组合在一起。然后,我们分别调用 h(2)h(1)h(0),并打印出结果,以验证组合函数的正确性。

请注意,使用 flatMap 方法可以处理 None 值的情况,将其传递给下一个函数进行处理,从而实现了两个函数的组合。

scala中Some的作用?

在 Scala 中,Some 是一种表示存在值的类型,它是 Option 的子类之一。Option 是 Scala 中用于处理可能存在或可能不存在值的容器类型。

Some 表示一个非空值的容器。它用于封装一个具体的值,并表示该值存在。

Some 的主要作用是在需要表示一个可能存在值的情况下,提供一种类型安全的方式。它可以与 None(表示不存在值)一起使用,构成一个完整的选项。

下面是一个示例,展示了 Some 的使用:

val someValue: Option[Int] = Some(42)

someValue match {
  case Some(value) => println(s"The value is: $value")
  case None => println("No value found")
}

在上述代码中,我们创建了一个 Some 对象,将整数值 42 封装在其中。然后,我们使用模式匹配来检查 someValue 是否是 Some 类型,并从中提取值。

如果 someValueSome,我们可以通过模式匹配中的 value 变量访问封装的值,并进行相应的操作。如果 someValueNone,则执行相应的操作。

通过使用 Some,我们可以明确表示一个可能存在的值,并在需要时进行安全访问。这有助于编写更健壮和可读的代码。

2、编写函数values(fun:(Int)=>Int,low:Int,high:Int),该函数输出一个集合,对应给定区间内给定函数的输入和输出。比如,values(x=>x*x,-5,5)应该产出一个对偶的集合(-5,25),(-4,16),(-3,9),…,(5,25)

下面是一个实现了 values 函数的示例代码,该函数接受一个函数 fun: Int => Int、一个起始值 low 和一个结束值 high,并输出一个对偶的集合,对应于给定区间内给定函数的输入和输出:

def values(fun: Int => Int, low: Int, high: Int): Seq[(Int, Int)] = {
  (low to high).map(x => (x, fun(x)))
}

val result = values(x => x * x, -5, 5)
result.foreach(println)

在上述代码中,我们定义了一个 values 函数,它接受一个函数 fun、一个起始值 low 和一个结束值 high。我们使用 map 方法遍历从 lowhigh 的整数范围,并将每个整数 x 和函数应用于 x 的结果 (x, fun(x)) 组成对偶,然后将其收集到一个集合中。

在测试代码中,我们调用 values 函数,并传入一个函数 x => x * x 和区间 -55。然后,我们遍历结果集合,并打印每个对偶。

运行上述代码,将会输出以下内容:

(-5,25)
(-4,16)
(-3,9)
(-2,4)
(-1,1)
(0,0)
(1,1)
(2,4)
(3,9)
(4,16)
(5,25)

这个例子展示了如何使用 values 函数来生成给定函数在指定区间内的输入和输出对偶。

3、如何用reduceLeft得到数组Array(1,333,4,6,4,4,9,32,6,9,0,2)中的最大元素?

可以使用 reduceLeft 方法来获取数组中的最大元素。下面是一个使用 reduceLeft 的示例代码:

val arr = Array(1, 333, 4, 6, 4, 4, 9, 32, 6, 9, 0, 2)
val maxElement = arr.reduceLeft((a, b) => if (a > b) a else b)

println(maxElement)  // 输出:333

在上述代码中,我们定义了一个名为 arr 的整数数组。然后,我们使用 reduceLeft 方法来逐个比较数组中的元素,并返回最大的元素。

在这个例子中,我们传递了一个函数 (a, b) => if (a > b) a else breduceLeft 方法。这个函数接收两个参数 ab,比较它们的值,并返回较大的值作为下一次比较的输入。

最终,reduceLeft 方法返回了数组中的最大元素,并将其赋值给 maxElement 变量。我们将其打印出来,以验证结果。

请注意,reduceLeft 方法会从数组的第一个元素开始,依次将元素传递给函数进行比较。所以确保数组非空,并且有至少一个元素。如果数组为空,或者没有提供初始值,将会抛出 UnsupportedOperationException 异常。

4、用to和reduceLeft实现阶乘函数,不得使用循环或递归

可以使用 to 方法和 reduceLeft 方法来实现阶乘函数。下面是一个使用 toreduceLeft 的示例代码:

def factorial(n: Int): BigInt = (1 to n).reduceLeft(_ * _)

val result = factorial(5)
println(result)  // 输出:120

在上述代码中,我们定义了一个名为 factorial 的函数,它接受一个整数 n 作为参数,并返回其阶乘值。

在函数体内,我们使用 to 方法生成一个整数范围,从 1n。然后,我们使用 reduceLeft 方法将范围内的所有元素进行累乘,从而得到阶乘的结果。

最后,我们调用 factorial 函数,并传入 5 作为参数,将结果赋值给 result 变量,并将其打印出来,以验证结果。

需要注意的是,由于阶乘的结果可能非常大,超出了整数的表示范围,因此我们使用了 BigInt 类型来存储阶乘的结果。

5、编写函数largest(fun:(Int)=>Int,inputs:Seq[Int]),输出在给定输入序列中给定函数的最大值。举例来说,largest(x=>10x-xx,1 to 10)应该返回25.不得使用循环或递归

下面是一个编写了 largest 函数的示例代码,该函数接受一个函数 fun: Int => Int 和一个整数序列 inputs,并输出在给定输入序列中给定函数的最大值:

def largest(fun: Int => Int, inputs: Seq[Int]): Int = {
  inputs.map(fun).max
}

val result = largest(x => x * x, Seq(1, 3, 5, 2, 4))
println(result)  // 输出:25

在上述代码中,我们定义了一个 largest 函数,它接受一个函数 fun 和一个整数序列 inputs。我们使用 map 方法将函数 fun 应用于每个输入,并生成一个新的序列。然后,我们使用 max 方法找到新序列中的最大值,并返回该值作为结果。

在测试代码中,我们调用 largest 函数,并传入一个函数 x => x * x 和一个整数序列 Seq(1, 3, 5, 2, 4)。然后,我们将结果赋值给 result 变量,并将其打印出来,以验证最大值的正确性。

请注意,这里的 largest 函数假设输入序列 inputs 非空,否则将抛出 UnsupportedOperationException 异常。

6、要得到一个序列的对偶很容易,

比如:
val pairs = (1 to 10) zip (11 to 20)
编写函数adjustToPair,该函数接受一个类型为(Int,Int)=>Int的函数作为参数,
并返回一个等效的, 可以以对偶作为参数的函数。
举例来说就是:adjustToPair(_*_)((6,7))应得到42。
然后用这个函数通过map计算出各个对偶的元素之和

是的,要得到一个序列的对偶(元素交换位置)是比较容易的。在 Scala 中,可以使用 map 方法和匿名函数来实现这个操作。下面是一个示例代码:

val sequence = Seq(1, 2, 3, 4, 5)
val pairs = sequence.map(x => (x, x))

println(pairs)

在上述代码中,我们定义了一个名为 sequence 的序列,包含了一些整数元素。然后,我们使用 map 方法对序列中的每个元素进行处理,使用匿名函数 (x => (x, x)) 将每个元素转换为对偶。

最后,我们将生成的对偶序列 pairs 打印出来,以验证结果。

运行上述代码,将会输出以下内容:

List((1,1), (2,2), (3,3), (4,4), (5,5))

这个例子展示了如何使用 map 方法和匿名函数将一个序列的元素转换为对偶,即每个元素都和自身形成一个对偶。

7、实现一个unless控制抽象,工作机制类似if,但条件是反过来的

可以通过定义一个接受条件和代码块的 unless 函数来实现一个类似 if 的控制抽象,但条件是反过来的。下面是一个示例代码:

def unless(condition: => Boolean)(codeBlock: => Unit): Unit = {
  if (!condition) {
    codeBlock
  }
}

var x = 5

unless(x > 10) {
  println("x is less than or equal to 10")
}

在上述代码中,我们定义了一个 unless 函数,它接受一个条件和一个代码块。条件是以传名参数的方式传递的,通过 condition: => Boolean 来定义。代码块也是以传名参数的方式传递的,通过 codeBlock: => Unit 来定义。

unless 函数内部,我们使用 if (!condition) 来判断条件是否为假。如果条件为假,则执行传入的代码块 codeBlock

在测试代码中,我们定义了一个变量 x 并赋值为 5。然后,我们调用 unless 函数,并传入条件 x > 10 和代码块 println("x is less than or equal to 10")。由于条件 x > 10 为假,所以代码块将被执行,输出相应的消息。

这样,通过 unless 控制抽象,我们可以在条件为假时执行特定的代码块,实现类似于 if 但条件反过来的控制流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala作业(9)---模式匹配&&&高阶函数 的相关文章

  • 对两种类型之间的二元关系进行建模

    有企业 也有人 用户可以对某个企业点赞或发表评论 但效果是一样的can not发生在一个人身上 当用户发布有关某个企业的内容或对其点赞时 该企业就被称为target喜欢或帖子 trait TargetingRelation Targetin
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • 如何使用 Spark 2 屏蔽列?

    我有一些表 我需要屏蔽其中的一些列 要屏蔽的列因表而异 我正在读取这些列application conf file 例如 对于员工表如下所示 id name age address 1 abcd 21 India 2 qazx 42 Ger
  • Scala中有类似Java Stream的“peek”操作吗?

    在Java中你可以调用peek x gt println x 在 Stream 上 它将对每个元素执行操作并返回原始流 这与 foreach 不同 foreach 是 Unit Scala 中是否有类似的东西 最好是适用于所有 Monady
  • andThen 类型不匹配的 Scala 链接函数

    我有一堆函数可以清理文本并将它们分成单词 最小的例子 val txt Mary had a little nlamb val stopwords Seq a def clean text String String text replace
  • Slick和bonecp:org.postgresql.util.PSQLException:FATAL:抱歉,太多客户端已经错误

    当我在本地开发应用程序时 我使用以下命令启动我的 play2 应用程序sbt run 我喜欢如何更改代码 然后重新加载浏览器以查看我的更改 在大约 10 次代码更改之后 我收到 postgresql 太多连接错误 见下文 我的数据库连接使用
  • 如何在超时的情况下在单独的调度程序上运行 Akka Streams 图?

    这个问题是基于我做过的一个宠物项目 这个SO https stackoverflow com questions 34641861 akka http blocking in a future blocks the server 34645
  • IntelliJ:线程“主”java.lang.NoClassDefFoundError中的异常:org/apache/spark/sql/types/DataType

    附言 有一个类似的问题here https stackoverflow com questions 40287289 java lang noclassdeffounderror org apache spark logging 但那是在
  • 在 Spark 结构化流 2.3.0 中连接两个流时,左外连接不发出空值

    两个流上的左外连接不发出空输出 它只是等待记录添加到另一个流中 使用套接字流来测试这一点 在我们的例子中 我们想要发出具有 null 值的记录 这些记录与 id 不匹配或 且不属于时间范围条件 水印和间隔的详细信息如下 val ds1Map
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • Kafka 分区键无法正常工作

    我正在努力解决如何正确使用分区键机制的问题 我的逻辑是设置分区号为3 然后创建三个分区键为 0 1 2 然后使用分区键创建三个KeyedMessage 例如 KeyedMessage 主题 0 消息 KeyedMessage 主题 1 消息
  • 火花内存不足

    我有一个文件夹 里面有 150 G 的 txt 文件 大约 700 个文件 平均每个 200 MB 我使用 scala 来处理文件并最终计算一些汇总统计数据 我认为有两种可能的方法可以做到这一点 手动循环所有文件 对每个文件进行计算并最终合
  • Scala 的“神奇”函数列表

    在哪里可以找到 Scala 的 神奇 函数列表 例如apply unapply update etc 魔法函数是指编译器的某些语法糖使用的函数 例如 o update x y lt gt o x y 我用谷歌搜索了一些组合scala mag
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • Spark:查找前 n 个值的高性能方法

    我有一个很大的数据集 我想找到具有 n 个最高值的行 id count id1 10 id2 15 id3 5 我能想到的唯一方法是使用row number没有分区就像 val window Window orderBy desc coun
  • 过滤器的 Scala 集合类型

    假设您有一个 List 1 1 其类型为 List Any 这当然是正确的且符合预期 现在如果我像这样映射列表 scala gt List 1 1 map case x Int gt x case y String gt y toInt 结
  • @tailrec为什么这个方法不编译为“包含不在尾部位置的递归调用”?

    tailrec private def loop V key String V key match case gt loop key 此方法无法编译并抱怨它 包含不在尾部位置的递归调用 有人可以向我解释一下发生了什么事吗 这个错误消息对我来
  • 为什么同样的算法在 Scala 中运行比在 C# 中慢得多?以及如何让它更快?

    该算法根据序列中每个成员的变体创建序列的所有可能变体 C 代码 static void Main string args var arg new List
  • 在 Scala 中提取案例类字段名称

    我有一个案例类 case class A field1 String field2 Int 我想在某些代码中引用确切的字符串 field1 例如 val q Query field1 gt hello performQuery q 现在我必
  • 在 Scala 中扩展函数1

    在几个例子中 我看到一个对象或一个类扩展Function1 E g object Cash extends CashProduct gt String in Scala 的隐藏功能 https stackoverflow com quest

随机推荐

  • java里的ClassNotFoundException

    1 Caused by java lang ClassNotFoundException org springframework security oauth2 common util RandomValueStringGenerator
  • 把浏览器中的页面数据下载为pdf

    把浏览器中的页面数据下载为pdf 页面样子 https img blog csdnimg cn 7c0f58887b6c40fe8a7112800e9a8c93 png 下载后效果 只是内容不一致而已 样式差不多 文章目录 把浏览器中的页面
  • win10telnet配置和telnet用法

    Telnet协议 Telnet协议是TCP IP协议族中的一员 是Internet远程登录服务的标准协议和主要方式 它为用户提供了在本地计算机上完成远程主机工作的能力 在终端使用者的电脑上使用telnet程序 用它连接到服务器 终端使用者可
  • curl源码编译安装

    https curl haxx se download html 首先去curl官网下载对应版本 这里有个坑需要注意 如果下载的源码版本太高 编译是成功的 但是curl可执行文件访问https的时候还是会报各种奇怪的错误 所以我这里的做法是
  • No module named ‘typing_extensions‘

    No module named typing extensions 在运行程序时出现如下报错 解决方法 在运行程序时出现如下报错 File E Anaconda install Dic envs python38 lib site pack
  • nginx try_files用法 及Nginx location的一些配置

    实例 Yii2推荐ngnix try files配置 location try files uri uri index html args 找指定路径下文件 如果不存在 则转给哪个文件执行 try files 语法 try files fi
  • Java 内存模型(JMM),一看就懂 清晰明了

    一 线程私有的内存区域 1 程序计数器 当前线程所执行的字节码的行号指示器 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令 它是程序控制流的指示器 2 虚拟机栈 线程调用 Java 方法时 每个方法每次调用都会
  • 基于形状的模板匹配来寻找稍微变形的图像

    方案 直接用整幅图像做模板匹配 下面是过程 原图 创建模板 下图是模板的轮廓 需要识别的图像 识别结果 代码 dev update off read image ModelImage food cocoa package model dev
  • Java 运行jar包变更配置文件与变量

    文章目录 前言 实现原理 不同环境的配置文件 变更配置变量 前言 为实现快速搭建和开发 项目以Springboot框架搭建 springboot搭建的项目可以将项目直接打成jar包并运行 无需自己安装配置Tomcat或者其他服务器 是一种方
  • 李宏毅2023机器学习作业HW03解析和代码分享

    ML2023Spring HW3 相关信息 课程主页 课程视频 Kaggle link Sample code HW03 视频 HW03 PDF 个人完整代码分享 GitHub Gitee GitCode P S 即便 kaggle 上的时
  • 我的C++学习日志

    安装Mac上的C 编辑器 clang cmake 安装方法 Xnode shell 编译 方法 在Mac上设置iTerm 设置方法 写出第一个 Hello World 的程序 学习计划 听youtube视频 阅读c primer
  • s5pv210-uboot移植前言

    最近找工作 买了块飞凌的ok210 使用s5pv210的开发板 但是最重要的nandflash居然不开源 很恼火 于是想从头自己在这个板子上开发 计划这个工作做两年 看看两年的业余时间到底能够搞出点什么东西出来 感觉难度应该很大 但是应该可
  • JDK17遇到报错 module java.base does not “opens java.util“ to unnamed module 问题解决

    在Java 9及以上版本运行应用程序时 在各种情况下都会发生此异常 详细可以参考 module java base does not opens java lang to unnamed module 滔天蟹 博客园 https www c
  • SpringSecurity学习笔记(四)注销登录、获取用户数据

    参考视频 编程不良人 注销登录 默认情况下 如果我们已经登录了 然后get方式访问 logout接口就会注销登录 下次再访问受限资源就会提示我们重新登录 我们可以在ss过滤器的配置里面添加下面的配置 and logout logoutUrl
  • tensorflow 运行时候遇到 Error in `python': double free or corruption (fasttop)

    参考https github com tensorflow tensorflow issues 6968 我是用pip install no binary all force reinstall numpy 解决的
  • 20171007离线赛总结

    考试时的思路 第一题先循环水一个80分出来 第二题先水70分 再用倍增枚举每一个坦克对应的下一个坦克 第三题直接上DFS 能拿多少拿多少 题解 第一题 S数 这道题 我打了个表 然后用二分法来做 记录每个答案的位置 即可得解 但是最后时间不
  • IDE/mingw下动态库(.dll和.a文件)的生成和部署使用(对比MSVC下.dll和.lib)

    文章目录 概述 问题的产生 基于mingw的DLL动态库 基于mingw的EXE可执行程序 Makefile文件中使用Qt库的 a文件 mingw下的 a 文件 和 dll 到底谁起作用 小插曲 mingw 生成的 a文件到底是什么 为啥m
  • jquery easyui combobox加载数量过多引起渲染页面缓慢问题

    有些时候 当我们用easyui combobox控件加载页面数据的时候 由于数据量过多 几千几万 而且如果操作频繁的话 进而会引起需要加载半天才能去打开下拉面板 还有可能卡死 其实这种问题主要时间浪费在了渲染下拉面板上面 作者在遇到这种问题
  • linux内核-网络

    网络栈 linux内核网络协议栈架构分析 全流程分析 干货 舞起勿忘的博客 CSDN博客 内核协议栈 https blog csdn net yming0221 column info linux kernel net netfilter的
  • Scala作业(9)---模式匹配&&&高阶函数

    模式匹配 1 利用模式匹配 编写一个swap函数 接受一个整数的对偶 返回对偶的两个组成部件互换位置的新对偶 下面是使用模式匹配编写的 swap 函数 接受一个整数的对偶 返回对偶的两个组成部分互换位置的新对偶 def swap pair