《scala 编程(第3版)》学习笔记4

掌握Scala编程:《快学Scala第二版》全面指南 Scala,作为一门集成了面向对象编程和函数式编程特性的多范式编程语言,自其诞生之初就吸引了大量的关注。本章将带你进入Scala的世界,从基础语法开始,逐步深入,帮助你搭建起对这门语言的理解框架。类型推断是指编译器根据上下文自动推断出变量或表达式的类型。在Scala中,几乎所有的类型声明都可以省略,编译器能够根据变量的初始赋值推断出其类型。这种方式不仅减少了代码的冗余,还能使代码更加简洁明了。类型推断的重要性在于它促进了更灵活的编程实践,提升了开发效率,并且使得代码更加易于维护和重构。 阅读详情

第14章 断言和测试

  1. Predef的assert(condition)或assert(condition,explanation),condition如果不满足,则抛出AssertionError。explanation类型为Any,可以传入任何对象,将调用对象的toString打印输出。P258
scala> assert(false,"test error")
java.lang.AssertionError: assertion failed: test error
  at scala.Predef$.assert(Predef.scala:170)
  ... 32 elided
  1. Predef的ensuring(condition),这里的condition为结果类型参数并返回Boolean的前提条件函数(即condition为函数)。使用方法为{代码块}ensuring(condition(x)),ensuring将{代码块}的结果x传递给condition(x)函数,如果condition(x)为true,则ensuring返回结果x,否则抛出AssertionError。P259
def func(a:Int):String={
 a.toString
}ensuring(_.length>2,"msg: 位数小于3")

scala> func(2)
java.lang.AssertionError: assertion failed: msg: 位数小于3
  at scala.Predef$Ensuring$.ensuring$extension3(Predef.scala:261)
  at .func(<console>:14)
  ... 32 elided
  1. ensuring一般用于内部测试,断言(assert, ensuring)可通过JVM -ea -da来分别打开或关闭。P260
  2. 外部测试,ScalaTest框架(官方指导),FunSuite风格。
  3. scalatest涉及三方jar包导入,idea的三方jar包导入方式(单个,批量),导入后即可正常 org.scalatest.FunSuite(3.2.0版开始已经没有Funsuit了,而是用funsuite.AnyFunSuite(官方指导))。当然,也可以使用构建maven工程+pom.xml方式导入。(todo:有时间单独出一期直接导入和pom导入的教程)
    <dependency>
      <groupId>org.scalatest</groupId>
      <artifactId>scalatest_2.11</artifactId>
      <version>3.2.0</version>
      <scope>test</scope>
    </dependency>
import org.scalatest.funsuite

class MyTest extends funsuite.AnyFunSuite {
  val s = "a b c d"
  //assert 一般断言
  test("长度大于4"){
    assert(s.length > 4)
  }

  test("长度大于8"){
    assert(s.length >8)
  }

  //assertResult 将预期与实际值区分开来;
  val a = 5
  val b = 2
  assertResult(2) {
    a - b
  }

  //assertThrows 以确保一些代码抛出预期的异常。捕获正确异常,则返回succeeded的Assertion,否则,返回TestFailedException
  val s2 = "hi"
  assertThrows[IndexOutOfBoundsException] { // Result type: Assertion
    s2.charAt(-1)
  }

  //intercept和assertThrows 表现一样,但若捕获正常异常的话,则返回IndexOutOfBoundsException。
  val caught =
    intercept[IndexOutOfBoundsException] { // Result type: IndexOutOfBoundsException
      s2.charAt(-1)
    }
  assert(caught.getMessage.indexOf("-1") != -1)

  //带clue版本
  assert(1 + 1 === 3, "this is a clue")
  assertResult(3, "this is a clue") { 1 + 1 }
  withClue("this is a clue") {
    assertThrows[IndexOutOfBoundsException] {
      "hi".charAt(-1)
    }
  }
}

第15章 样例类和模式匹配

  1. 样例类(case classes)和模式匹配(pattern matching)为我们编写规则的、未封装的数据结构提供支持。对于表达树形的递归数据尤为有用。P271
  2. 样例类的定义和普通类一样,只是在class前面增加了case:
// 类定义
case class 类名[(参数列表)]{//注意,区别于函数,没有=
   //类的定义
}

case class  A(name:String)

val a=A("test") //实例化
  1. 样例类case的使用,会添加一些语法上的便利:
    • 会添加一个跟类同名的工厂方法。这样,创建实例的时候,就可以直接用 类名(参数),而不需要 new 类名(参数)P272
      • 实际上是自动创建了伴生对象,并添加了apply,用于不用new创建对象
      • 伴生对象中添加了unapply方法,用于样例类的模式匹配
    • 类参数都隐式获得了一个val前缀,直接变成了字段。也可指明为var型。可直接引用 a.name。P273
    • 编译器会帮我们以“自然"的方式实现toString、hashCode和equals方法(比较包含类及入参的整棵树)。可简单的认为,对于引用类型,==即equals,所以==也被很好的实现了。P273
    • 编译器会添加一个copy方法用于可修改部分内容的拷贝(通过a.cpoy(arg1="新值")实现),如果不修改任何东西,则用老对象中的原值。P273
    • 最大的好处是他们支持模式匹配。
  2. 模式匹配P274
选择器 match { 可选分支 }

//可选分支
case 模式 => 表达式
  1. 模式匹配中的模式:P275-286
    • 常量模式,例如"str1",123,按照==要求跟他们相等的值
    • 变量模式,例如 case e => 表达式中可利用e中的e,变量e可匹配任何值,主要是为了利用它(todo: 在使用时e的类型怎么保证?)
      • 任何字面量都可以当做常量(模式)使用
      • 任何val和单例对象也可当做常量(模式)使用
      • 例如Nil这个单例对象,能且仅能匹配空list
    • 通配模式,即_,匹配任何值,但不利用这些值。
    • 构造方法模式,例如 类名(参数),这样参数也可以是模式,从而减少繁琐的判断。例case ClassA("str1",123, e)=>对e做操作。这样要求选择器是ClassA类型,而且第1个参数是"str1",第二个参数时123。
    • 序列模式,如List或Array
    • 元组模式
    • 带类型的模式-可用于代替冗长的类型测试和类型转换。
      • 类型擦除:类型参数信息不会被scala运行时保留,所以Map[Int,Int]和Map[,]是一样的,匹配不了里面的类型信息P285
      • 类型擦除特例:Array是能保留的,因为scala对Array做了特殊处理P285
    • 通配模式保底是必要的(当然也可用变量模式保底,只不过是给任何值取了个变量名),因为如果有没有匹配上的模式,会报MatchError错误。P278
exp match{
case "str1" | 123 => println("...") //常量模式
case e => println("...") //变量模式
case ClassA("str1",123, e)=> println(e) //构造方法模式
case List(0,_,_) | List(1,_*) => ... //序列模式
case (a,b,c) => ... //元组模式
case s:String | m:Map[_,_] | a:Array[String]=> ... //带类型的模式
case _ =>  //通配模式
}
  1. 常量模式和变量模式的冲突P279
    • 为了防止冲突,scala会把以小写字母开头的名称当做模式变量处理(不取值,做新命名),其他的都是模式常量(可以理解成会先取值,再匹配)
    • 小写字母开头的名称怎么当做模式常量处理呢?
      • 加限定词 如 obj.pi,this.pi
      • 用反引号,如`pi`。
  2. 变量绑定:除变量模式外,其他所有模式都可在匹配成功后绑定给一个变量。格式 e @ 模式。
  3. scala要求模式都是线性的:同一个模式变量在模式中只能出现一次。P287
  4. 模式守卫:if 变量相关条件表达式,除了模式要匹配,同时还要满足if后面的表达式结果为true,才能匹配成功。P287
  5. 密封类。没有缺省行为,如何保证自己的枚举覆盖了所有场景?使用密封类。P289
    • 密封类除了同一个文件里面定义的子类(用样例类case class实现)之外,不能添加新的子类
    • 密封类的样例类做匹配时,如果遗漏了,编译器会给出警告
    • 如果类打算被用于模式匹配,则推荐使用密封类
    • 可以用缺省行为跳过部分样例类的检查,但是不是推荐方案,推荐方案是用@unchecked注解。编译器对后续模式分支的覆盖完整性检查就会跳过。
sealed abstract class Expr
case class Var(name:String) extends Expr
case class Number(num:String) extends Expr

def func1(e:Expr):String =(e:@unchecked) match{
	case Var(_)=>"a number"
}//不会警告
  1. Option类型。有两种形式 Some(x)和None。用于防止处理无值时的报错情况。scala中的null是Null类型,是引用类AnyRef的子类,不是值类的子类。值类无值的时候(可用Unit的()表示),就不好统一处理。Option的None提供了一种统一处理方案。P292
//Option类的常用提取方法
def getValue(x:Option[String])=x match{
	case Some(s) => s
	case None => "?"
}

  1. 一切皆模式。并不仅限于match表达式。
    • 变量定义
    • case序列
      • {case ...;case ...}这样的语句叫做case序列。可以用在任何允许出现函数字面量的地方,即当做函数使用。
      • case序列本质上就是一个函数字面量。
      • case序列的每个case都是一个入口,每个入口都有自己的参数列表。
      • case序列是一个偏函数(partial function),偏函数是指在某些值没有定义的函数,参数为这些值时会报错。简单理解偏函数和部分应用函数。偏函数定义为PartialFunction,则会自动添加是否有定义的函数isDefinedAt,使用前先判断是否有定义。
    • for表达式
      • 不能匹配给定模式的值会被直接丢弃(相当于省略了普通for语句的if子句)P297
// 变量定义中
val (numb,str)=(123,"abc")
val BinOp(op,left,right)=new BinOp("*",Number(5),Number(1)) //样例类解开

//作为偏函数的case序列
val signal: Int=> Int = {
	//case 0 => 0
	case x if x > 0 => x - 1
	case x if x < 0 => x + 1
}
signal: Int => Int = <function1>
> signal(1)
res0: Int = 0
> signal(0)
scala.MatchError: 0 (of class java.lang.Integer)
  at $anonfun$1.apply$mcII$sp(<console>:13)
  ... 32 elided

// 定义为PartialFunction,则会自动添加是否有定义的函数isDefinedAt
val signal: PartialFunction[Int, Int] = {
    //case 0 => 0
    case x if x > 0 => x - 1
    case x if x < 0 => x + 1
}
signal: PartialFunction[Int,Int] = <function1>

scala> signal(0)
scala.MatchError: 0 (of class java.lang.Integer)
  at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:253)
  at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:251)
  at $anonfun$1.applyOrElse(<console>:11)
  at $anonfun$1.applyOrElse(<console>:11)
  at scala.runtime.AbstractPartialFunction$mcII$sp.apply$mcII$sp(AbstractPartialFunction.scala:36)
  ... 32 elided

scala> signal.isDefinedAt(0) //使用前先判断
res3: Boolean = false

// for 表达式
 val a=List(Some("a"),None,Some("b"))
 > for( Some(x)<- a) println(x) //None被自动跳过
a
b

第26章 提取器

本章相当于15章 的进阶版本,所以放在这里先讲。

  1. 提取器是拥有名为unapply成员方法的对象,即提取器是对象Object。P591
    • 通常还会定义一个apply方法对应unapply的逆过程,非必选。
    • unapply方法返回Option类型或Boolean类型(博主目前看到这两种,或许还有其他类型)。
    • 该对象可以是伴生对象,那样的话,如果编写了apply方法,则不需要用new来创建对象了。
    • 通过样例类(case classs)的学习,可以知道样例类实际上就是已经实现了apply和unaply伴生类
      在这里插入图片描述
      在这里插入图片描述
//实例1
class Student10 {
  var name:String = _   // 姓名
  var age:Int = _       // 年龄
  
  // 实现一个辅助构造器
  def this(name:String, age:Int) = {
    this()
    
    this.name = name
    this.age = age
  }
}

object Student10 {
  def apply(name:String, age:Int): Student10 = new Student10(name, age)

  // 实现一个解构器
  def unapply(arg: Student10): Option[(String, Int)] = Some((arg.name, arg.age))
}

object App2 extends App {
  val zhangsan = Student10("张三", 20) //因为apply方法的存在,不需要用new

  zhangsan match {
    case Student10(name, age) => println(s"姓名:$name 年龄:$age")//自动调用unapply方法解构后做模式匹配
    case _ => println("未匹配")
  }
}

//实例2,通过样例类的学习,可以知道样例类实际上就是已经实现了apply和unaply伴生类

case class Student10( name:String,age:Int) 

object Student10 { //再用伴生对象就会和样例类自动生成的伴生对象冲突
  def apply(name:String, age:Int): Student10 = Student10(name, age)

  // 实现一个解构器
  def unapply(arg: Student10): Option[(String, Int)] = Some((arg.name, arg.age))
}

object App2 extends App {
  val zhangsan = Student10("张三", 20) 

  zhangsan match {
    case Student10(name, age) => println(s"姓名:$name 年龄:$age")
    case _ => println("未匹配")
  }
}
报错:
ambiguous reference to overloaded definition,
both method apply in object Student10 of type (name: String, age: Int)org.example.Student10
and  method apply in object Student10 of type (name: String, age: Int)org.example.Student10
报错:
method unapply is defined twice
  conflicting symbols both originated in file 'D:\git\scala_test\pon_test\src\main\scala\org\example\Student10.scala'
case class Student10( name:String,age:Int)

// 实例3,样例类等价形式:
case class Student10( name:String,age:Int) 

object App2 extends App {
  val zhangsan = Student10("张三", 20) 

  zhangsan match {
    case Student10(name, age) => println(s"姓名:$name 年龄:$age")
    case _ => println("未匹配")
  }
}
  1. Some(a,b)跟Some((a,b))是同一个意思P592。
  2. 一个更直观更单纯的提取器。P592
    • 待匹配值和unapply的参数类型一致并不是必须的 P593
    • 模式匹配逻辑首先检查给定值是否符合unapply的参数类型的要求,符合要求则转换成unapply的参数类型(博主推测是通过多态实现),不符合的话模式匹配就会失败。
object EMail{
	def unapply(str:String):Option[(String,String)]={
		val parts= str split "@"
		
		if (parts.length == 2) {
			Some(parts(0),parts(1))
		}else None
	}
}
//应用
val x: Any ="xlt@1243.com" //可转换为String
x match{
   case EMail(user,domain)=> println(user,domain)
}
(xlt,1243.com)

scala>  val x:Any=123//类型无法转换,匹配失败
scala> x match{
     |    case EMail(user,domain)=> println(user,domain)
     | }
scala.MatchError: 123 (of class java.lang.Integer)
  ... 34 elided
  1. 提取0个参数的模式。
    • unapply返回False表示匹配失败
    • 不带参数的模式需要加上(),否则变成比较对象的相等性了 P595
  2. 多个提取器嵌套时,从外层匹配到内层。如case Email(Twice(x @UpperCase()),domain)P595
  3. 变长参数匹配。定义unapplySeq方法,返回类型必须是Option[Seq[T]]类型。
object Domain{
	def unapplySeq(whole:String):Option[Seq[String]]={
		Some(whole.split("\\.").reverse)
	}
}
//使用
"www.baidu.com" match {
	case Domain("com", x @ _*)=>true //取到的x是WrappedArray[T] 类型
	case _=> false
}
  1. 提取器 vs 样例类P600
    • 样例类的缺点:把数据的具体类型暴露给使用方。如case C()中的C。如果样例类被别人使用并包含了模式匹配,重命名或者改名样例类的继承关系都会影响使用方。提取器则没有这个问题。
    • 如果要暴露给别人使用,则考虑从提取器开始、
    • 如果看不出哪个好,从样例类开始,因为样例类更简单。
  2. 正则表达式。P603
    • raw字符串表示:"""any string"""
    • 正则表达式的类型:scala.util.matching.Regex。两种创建方法:P602
      • val r=new Regex("""any string""")
      • """val r=any string""".r
    • 正则表达式定义了一些常用方法。findFristIn,finddAllIn findPrefixOf等,返回Option或者Iterator类型。
    • 每个正则表达式都定义了一个提取器。正则表达式的group对应提取器unapplySeq返回的Seq的每个元素。
val R="""(-)?(\d+)(\.\d*)?""".r
val R(s,i,d)="-1.23" //使用提取器的模式匹配

其他

  1. 下划线用途总结

1、存在性类型:Existential types
def foo(l: List[Option[_]]) = ...
 
2、高阶类型参数:Higher kinded type parameters
case class A[K[_],T](a: K[T])
 
3、临时变量:Ignored variables
val _ = 5
 
4、临时参数:Ignored parameters
List(1, 2, 3) foreach { _ => println("Hi") }
 
5、通配模式:Wildcard patterns
Some(5) match { case Some(_) => println("Yes") }
match {
     case List(1,_,_) => " a list with three element and the first element is 1"
     case List(_*)  => " a list with zero or more elements "
     case Map[_,_] => " matches a map with any key type and any value type "
     case _ =>
 }
val (a, _) = (1, 2)
for (_ <- 1 to 10)
 
6、通配导入:Wildcard imports
import java.util._
 
7、隐藏导入:Hiding imports
// Imports all the members of the object Fun but renames Foo to Bar
import com.test.Fun.{ Foo => Bar , _ }
 
// Imports all the members except Foo. To exclude a member rename it to _
import com.test.Fun.{ Foo => _ , _ }
 
8、连接字母和标点符号:Joining letters to punctuation
def bang_!(x: Int) = 5
 
9、占位符语法:Placeholder syntax
List(1, 2, 3) map (_ + 2)
_ + _   
( (_: Int) + (_: Int) )(2,3)
 
val nums = List(1,2,3,4,5,6,7,8,9,10)
 
nums map (_ + 2)
nums sortWith(_>_)
nums filter (_ % 2 == 0)
nums reduceLeft(_+_)
nums reduce (_ + _)
nums reduceLeft(_ max _)
nums.exists(_ > 5)
nums.takeWhile(_ < 8)
 
10、偏应用函数:Partially applied functions
def fun = {
    // Some code
}
val funLike = fun _
 
List(1, 2, 3) foreach println _
 
1 to 5 map (10 * _)
 
//List("foo", "bar", "baz").map(_.toUpperCase())
List("foo", "bar", "baz").map(n => n.toUpperCase())
 
11、初始化默认值:default value
var i: Int = _
 
12、作为参数名:
//访问map
var m3 = Map((1,100), (2,200))
for(e<-m3) println(e._1 + ": " + e._2)
m3 filter (e=>e._1>1)
m3 filterKeys (_>1)
m3.map(e=>(e._1*10, e._2))
m3 map (e=>e._2)
 
//访问元组:tuple getters
(1,2)._2
 
13、参数序列:parameters Sequence 
_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理。例如val s = sum(1 to 5:_*)就是将1 to 5当作参数序列处理。
//Range转换为List
List(1 to 5:_*)
 
//Range转换为Vector
Vector(1 to 5: _*)
 
//可变参数中
def capitalizeAll(args: String*) = {
  args.map { arg =>
    arg.capitalize
  }
}
 
val arr = Array("what's", "up", "doc?")
capitalizeAll(arr: _*)
【异常】DeepSeek API HTTP 401 认证失败错误完整排查与解决方案 摘要:本文针对DeepSeek API开发中的HTTP 401认证失败错误进行深度解析,指出该错误属于不可重试的认证类问题。文章首先拆解错误日志关键字段,区分401与其他API错误的本质差异。随后提供优先级排序的全链路解决方案:1)检查API密钥有效性;2)规范请求头认证格式;3)排查账户权限状态;4)验证请求环境配置。最后建议通过新建测试密钥、使用官方示例代码或联系技术支持进行兜底处理。全文采用技术脱敏处理,为开发者提供系统性的401错误排查指南。(149字) 阅读详情

相关推荐

科研智能体平台搭建与实战:大模型如何驱动科研自动化

大模型技术的快速发展,正推动AI智能体从单纯对话工具向主动执行任务的科研伙伴演进。智能体的核心原理在于整合模型调用、工具使用、知识库检索与工作流编排,使其能够自主拆解目标、执行操作并迭代优化。在科研场景中,这一技术价值尤为突出:文献初筛、实验数据清洗、代码调试、结果汇总等高频重复劳动均可实现自动化,大幅释放研究者精力。从基础组件配置到多智能体协同,从平台选型到提示词调优,实际落地需要关注模型匹配、工具稳定性、记忆管理与人机校验机制。本文基于真实工程经验,系统梳理科研智能体平台的搭建路径、应用案例与高频问题排

weixin_32597009的博客 284

[scala断言专栏]--使用断言

英文原文:http://www.scalatest.org/user_guide/using_assertions使用断言ScalaTest在任何风格特征中都默认使用三个断言。您可以使用:assert 一般断言assertResult 将预期与实际值区分开来;assertThrows 以确保一些代码抛出预期的异常。要在ScalaTest中快速移动,请学习并使用这三个断言。后来如果你喜欢你可以切换到...

欢迎来到我的博客,一起探索代码里的世界! 3687

AXI4-Stream FIFO IP核实战指南——从配置到跨时钟域处理

本文是AXI4-Stream FIFO IP核的实战指南,详细讲解了其作为数据流缓冲核心的作用。文章重点涵盖从Vivado环境下的IP核配置、关键参数(如深度与宽度)设定,到跨时钟域处理的完整流程。深入解析了TVALID/TREADY握手协议及TLAST等信号,并提供了常见问题排查与调试技巧,帮助开发者高效实现FPGA/SoC系统中可靠的数据流缓冲与同步。

weixin_29251567的博客 480

异常处理,断言

目录 一、断言 1、功能 2、assert关键字表示 3、idea开启断言 二、异常处理 1、异常Exception 2、错误Error 1、运行时异常 RuntimeException的子类都是运行时异常 空指针异常NullPointerException 数学异常ArithmeticException 索引越界异常IndexOutOfBoundsException 数字格式化异常 NumberFormatException 类型转换异常 ClassCastException

weixin_45701868的博客 1118

PCIe 6.0实战指南:从链路训练到信号完整性的避坑手册

本文是一份针对PCIe 6.0硬件工程师的实战避坑指南。文章深入解析了从NRZ到PAM4调制带来的信号完整性挑战,详细拆解了链路训练(LTSSM)的复杂过程与调试方法,并提供了从信道仿真到实验室实测(如使用Keysight示波器进行眼图与误码率分析)的完整信号完整性闭环验证策略,帮助工程师解决高速率下的链路不稳定与降速问题。

weixin_29306875的博客 342

【异常】解决JDK21升级中的SecurityException: JCE无法验证BC提供者问题

本文详细解析了JDK21升级中常见的SecurityException: JCE无法验证BC提供者问题的根源与解决方案。核心在于JDK21强化了JCE安全验证,导致签名不合规的老版本Bouncy Castle库被拒绝。文章提供了通过Maven依赖树精准定位、排除旧版本并引入兼容的bcprov-jdk18on新库的完整步骤,以及清理缓存等实战技巧,帮助开发者彻底解决此兼容性问题。

weixin_29197051的博客 490

您如何断言在 JUnit 测试中引发了某个异常?

如何以惯用方式使用 JUnit 来测试某些代码是否引发异常?虽然我当然可以做这样的事情:我记得有一个注释或一个 Assert.xyz 或其他东西,在这种情况下,JUnit 的精神远不那么笨拙,而且更符合 JUnit 的精神。

HuntsBot的博客 1161

一定能解决ROS系统 rosdep update超时问题de简单方法

rosdep update命令使用 1.首先将下面仓库的内容clone到本地 git clone https://github.com/ros/rosdistro.git 记录rosdistro存放地址,例如/home/gec/rosdistro 如果是自己的改成/home/user/rosdistro,其中user表示用户名 2.修改/usr/lib/python2/dist-packages/rosdep2/rep3.py文件 cd /usr/lib/python2/dist-packages/ros

努力是明天快乐的源泉 5万+

用一个例子告诉你 scala中的断言是什么?

用一个🌰告诉你 scala中的断言是什么?

向热爱自己一样,热爱这个世界。 327

置换矩阵、转置矩阵以及向量空间、子空间

置换矩阵、转置矩阵以及向量空间、子空间导读置换矩阵 导读 MIT矩阵分析课程之后的的二篇笔记。

qq_44677482的博客 1673

32、生物信息学中的符号、缩写及相关概念解析

本文详细解析了生物信息学中常用的符号、缩写及相关概念,涵盖概率理论、函数表示、模型结构、图与集合、维度参数、神经网络、隐藏马尔可夫模型、双向架构、语法系统、系统发育树、微阵列分析以及核方法与支持向量机等多个领域。通过表格和mermaid流程图的形式,系统梳理了各类符号的定义与应用场景,并介绍了常见缩写的全称与意义。文章旨在帮助研究人员准确理解生物信息学中的基础术语,提升对基因表达分析、序列建模、机器学习等技术的理解与应用能力。

rrr55的博客 146

Scala 中 ensuring 方法的使用说明

Scala 在方法里除了可用 assert() 方法像 Java 那样进行断言,还可以使用 ensuring() 方法在返回结果的分支的花括号同一行上进行断言。它们不同的是 assert 可以随意放在哪里对任何的 boolean 类型进行断言,而 ensuring 是用来对返回结果行断言的,所以它必须尾随返回结果处。 assert 和  ensuring 方法都是定方在 Predef 中的,所以可...

成长之路 1446

YOLOv11改进 | 注意力篇 | YOLOv11引入CA注意力机制

摘要:最近关于移动网络设计的研究已经证明了通道注意力(例如,挤压和激励注意力)对于提升模型性能的显着有效性,但它们通常忽略了位置信息,而位置信息对于生成空间选择性注意力图很重要。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~3.2 在Extramodule里创建CA。在CA.py文件里添加给出的CA代码。

tsg6698的博客 2979

Scala之父Martin Odersky作序推荐的Scala速学版(第3版)出版

Scala 是一个很有吸引力的选择。最后但同样重要的是, Scala 是静态类型语言, 允许编译器发现错误,这样就不至于要等到程序运行起来之后才能发现这些错误, 造成时间 上的浪费。本书是一本系统地介绍Scala语言的入门图书,针对Scala 3进行了全面的更新,不仅覆盖了Scala语言的基础知识,而且涵盖了许多更复杂的概念,并最终深入到非常高级的内容。本书共分20章,首先介绍了Scala语言的基础概念,以及控制结构和函数、数组操作、映射、Option、元组、类、对象和枚举、包、导入和导出、继承、文件和。

人邮异步社区 1465

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

豆瓣9.6分,Scala编程圣经第5版隆重来袭

要说Scala编程界的圣经,那必须是这本蜚声世界的、由Scala 语言缔造者Martin Odersky编写的—— 《Scala编程》 Programming in Scala 本书全面涵盖了整个编程语言、重要类库及其背后理念,全面且强大,是Scala领域当之无愧的王者之作! 本书上市14年来,紧跟语言版本持续迭代,不断以豆瓣评分8.9、9.2、9.4的成绩刷新着领域的天花板! 其中第三版的中文版更是以9.6高分傲视群雄。 第四版的中文版也收到不少读者的好评! 如今,这部长青经典之作又迎来了一次重大

博文视点(北京)官方博客 3万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Scala 的学习笔记

Scala 是 Scalable Language 的简写,是一门多范式的编程语言。Scala 是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质描述。类抽象机制的扩展有两种途径:一种途径是子类继承,另一种途径是灵活的混入机制。这两种途径能避免多重继承的种种问题。Scala 也是一种函数式语言,其函数也能当成值来使用。Scala 提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。

weixin_45866849的博客 4738

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Scala 的参数检查与断言: require, assert, assume 和 ensuring

似乎 C/C++ 的编程人员相比于 Java 更偏爱于断言,JDK 1.4 才开始引入 assert 的支持,但默认是关闭的,需要用 -ea 编译选项打开,否则代码中的 assert 语句全被忽略,一般会在单元测试中开启该选项。简单回顾一下 JDK 自带的断言,它用两种写法 assert object != null; assert object != null : "object

一叶不知秋 6349

ScalaTest——ScalaTest简介

1. ScalaTest简介 ScalaTest几乎已经成为Scala语言默认的测试框架,而在JVM平台下,无论是否使用Scala进行开发,我认为仍有尝试ScalaTest的必要。这主要源于它提供了多种表达力超强的测试风格,能够满足各种层次的需求包括单元测试、BDD、验收测试、数据驱动测试。 1. 1 UT与IT的风格选择 ScalaTest一共提供了七种测试风格,分别为:FunSuite,Fla...

雾幻的博客 3396

[转] org.scalatest.FunSuite Scala Examples - Scala FunSuite 测试的例子

[From]https://www.programcreek.com/scala/org.scalatest.FunSuite org.scalatest.FunSuite Scala Examples The following code examples show how to useorg.scalatest.FunSuite. These examples are ex...

weixin_30685047的博客 723

【Scala学习】测试类

文章目录SBT AND SCALATESTTHE MOST USED SCALA BUILD TOOL (SBT)The sbt directory structureCreating a “Hello, world” sbt project directory structureCreating a first *build.sbt* fileA “Hello, world” programUSING SCALATEST WITH SBTCreating the project directory str

有问题的请私信或关注v【技术印记】留言 1087

ScalaTest测试风格

建议使用 FlatSpec单元和集成测试以及 FeatureSpec验收测试。将FlatSpec作为默认选择,因为它与大多数开发人员熟悉的XUnit测试类似 2.1 FunSuite FunSuite可以轻松编写描述性测试名称,自然地编写集中测试,并生成类似规范的输出 import org.scalatest.FunSuite //ScalaTest提供了名为FunSuite的特质重载了execute方法从而可以用函数值的方式,而不是方法定义测试 class SetSuite extends FunSu

lingyeran的博客 242

ScalaTest——测试风格

建议使用 FlatSpec单元和集成测试以及 FeatureSpec验收测试。将FlatSpec作为默认选择,因为它与大多数开发人员熟悉的XUnit测试类似 2.1 FunSuite FunSuite可以轻松编写描述性测试名称,自然地编写集中测试,并生成类似规范的输出 import org.scalatest.FunSuite //ScalaTest提供了名为FunSuite的特质重载了execu...

雾幻的博客 4533

Scala Test

scala test有多种方式,可参见:http://www.scalatest.org 对于我个人而言,比较偏爱FunSuite,参考文章: http://www.scalatest.org/getting_started_with_fun_suite http://doc.scalatest.org/3.0.1/#org.scalatest.FunSuite 实操:   org.s...

遥望...... 2244

ScalaTest

ScalaTest 简介 ScalaTest 是一个开源的Java,Scala 的测试框架,它整合了JUnit, TestNG, Ant, and Maven 使你能非常高效,同时又符合你自己需要的单元测试方式。 API :http://www.scalatest.org/scaladoc/doc-1.2/ ScalaTest 单元测试基础 首先看一下ScalaTest 本身提供了哪些测试

lantian0802的专栏 3850

scala基本语法及注意点

scala有两种变量: val和var,val相当于Java中的final变量,一旦被赋值就不能修改。var相当于java中的普通变量。 constant为定义常量的关键字 定义函数: 如果函数没有返回值,那么返回类型为Unit类似Java的void。 如果最后的返回值类型是显而易见那么函数可以不写返回类型,否则就要写 如果函数体只有一条语句,可以不写大括号

拱头的专栏 6096

Scala的单元测试

Scala有着自己的单元测试,当然它也可以使用java的junit等单元测试 1、准备工作 你根据你需要的版本去下载单元测试的jar包(点击进入下载地址,从maven上面下载) 测试用例代码 class TestUtils { def Add(i:Int,j:Int):Int ={ i+j } } 2、单元测试 2.1 Suit单元测试 测试代码 import or

阿生 9107
上一篇: 日志分析系统:ELK
下一篇: sacalatest AnyFunSuite:no implicits found for parameter pos
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值