Scala在线运行

版本:

所属目录
点击了解高性能代码运行API
运行结果
教程手册
代码仓库
极速运行
终端运行
图形+终端

                        
以下是用户最新保存的代码
统计学生信息 发布于:2024-10-30 16:24 scala实用指南代码测试 发布于:2024-04-20 23:53 文本文件翻译 发布于:2024-03-15 14:27 九九乘法表 发布于:2024-03-08 20:22 工资计算函数 发布于:2024-03-08 20:10 薪水扣税计算 发布于:2024-03-08 20:04 乘法口诀表 发布于:2024-03-08 20:02 实际工资计算 发布于:2024-03-08 19:53 九九乘法表 发布于:2024-03-08 19:53 九九乘法表 发布于:2024-03-08 19:50 九九乘法表 发布于:2024-03-08 19:46 工资计算器 发布于:2024-03-08 19:43 工资函数计算 发布于:2024-03-08 19:41 02:工资计算函数的实现 发布于:2024-03-08 19:54 乘法口诀表 发布于:2024-03-08 19:41 工资计算函数的实现 发布于:2024-03-08 19:48 工资计算函数的实现 发布于:2024-03-08 19:51 01:编写代码实现1~9乘法口诀 发布于:2024-03-08 19:54 九九乘法表 发布于:2024-03-08 19:39 九九乘法口诀表 发布于:2024-03-08 19:38 实际工资计算 发布于:2024-03-08 19:45 乘法口诀表 发布于:2024-03-08 19:44 工资函数计算 发布于:2024-03-08 19:47 九九乘法表 发布于:2024-03-08 19:34 打印九九乘法表 发布于:2024-03-08 19:39 打印九九乘法表 发布于:2024-03-08 19:32 工资计算函数 发布于:2024-03-08 19:43 九九乘法表 发布于:2024-03-08 19:51 9*9乘法表scala 发布于:2024-03-08 19:43 demo4数组操作 发布于:2024-03-08 19:13 编程计算并输出下列级数的前n 项之和Sn,直到Sn 刚好大于或等于q为止,其中q 为大于0 的整数,其值通过键盘输入。例如, 若q 的值为50.0 , 则输出应为: Sn=50.416695 。请将源文件保存为exercise2-1.scala,在REPL 模式下测试运行,测试样例:q=1 时,Sn=2;q=30 时,Sn=30.891459;q=50 时,Sn=50.416695。 发布于:2024-03-04 22:55 成绩分析代码 发布于:2024-02-17 19:45 记录成绩代码 发布于:2024-02-17 17:15 # ## Scala学习 发布于:2024-02-17 16:12 Scala 水仙花 发布于:2023-12-25 19:51 我的第一个scala程序 发布于:2023-09-27 10:58 class ScalaTest1 { object ScalaClass { var a=10 val b=20 val c=a+b println(c) } } 发布于:2023-06-15 20:49 啊是公司的 发布于:2023-06-09 08:43 Scala - Determine whether a given integer number is prime in Scala 发布于:2023-04-23 18:49 输入一个整型数字,输出是否为奇数 发布于:2023-04-23 17:39 类对象(31-40) 发布于:2022-11-06 19:39 无论是继承abstract class或者混入trait,对于一个要实现的类来说,必须先用extends,剩下的用with,否则编译的时候就会出错。 发布于:2022-10-16 19:15 3.scala_3(循环) 发布于:2022-05-17 10:38 2.scala_2(条件判断) 发布于:2022-05-17 10:32 按市场是从 发布于:2022-03-22 14:24 person类 发布于:2022-03-04 21:46 第一个测试程序 发布于:2021-09-12 08:51 //The is first Demo My code 发布于:2021-09-10 11:22 scala 获取当前日期,日期的加减等 发布于:2020-12-29 14:38 [更多]
显示目录

基础(下)



学习嵌入式的绝佳套件,esp8266开源小电视成品,比自己去买开发板+屏幕还要便宜,省去了焊接不当搞坏的风险。 蜂鸣版+触控升级仅36元,更强的硬件、价格全网最低。

点击购买 固件广场

基础知识(下)

apply 方法

当类或对象有一个主要用途的时候,apply 方法为你提供了一个很好的语法糖。

scala> class Foo {}
defined class Foo

scala> object FooMaker {
     |   def apply() = new Foo
     | }
defined module FooMaker

scala> val newFoo = FooMaker()
newFoo: Foo = Foo@5b83f762

scala> class Bar {
     |   def apply() = 0
     | }
defined class Bar

scala> val bar = new Bar
bar: Bar = Bar@47711479

scala> bar()
res8: Int = 0

在这里,我们实例化对象看起来像是在调用一个方法。以后会有更多介绍!

单例对象

单例对象用于持有一个类的唯一实例。通常用于工厂模式。

object Timer {
  var count = 0

  def currentCount(): Long = {
    count += 1
    count
  }
}

可以这样使用:

scala> Timer.currentCount()
res0: Long = 1

单例对象可以和类具有相同的名称,此时该对象也被称为“伴生对象”。我们通常将伴生对象作为工厂使用。

下面是一个简单的例子,可以不需要使用

new

来创建一个实例了。

class Bar(foo: String)

object Bar {
  def apply(foo: String) = new Bar(foo)
}

函数即对象

在 Scala 中,我们经常谈论对象的函数式编程。这是什么意思?到底什么是函数呢?

函数是一些特质的集合。具体来说,具有一个参数的函数是 Function1 特质的一个实例。这个特征定义了 apply()语法糖,让你调用一个对象时就像你在调用一个函数。

scala> object addOne extends Function1[Int, Int] {
     |   def apply(m: Int): Int = m + 1
     | }
defined module addOne

scala> addOne(1)
res2: Int = 2

这个 Function 特质集合下标从 0 开始一直到 22。为什么是 22?这是一个主观的魔幻数字(magic number)。我从来没有使用过多于 22 个参数的函数,所以这个数字似乎是合理的。

apply 语法糖有助于统一对象和函数式编程的二重性。你可以传递类,并把它们当做函数使用,而函数本质上是类的实例。

这是否意味着,当你在类中定义一个方法时,得到的实际上是一个

Function*

的实例?不是的,在类中定义的方法是方法而不是函数。在 repl 中独立定义的方法是

Function*

的实例。

类也可以扩展 Function,这些类的实例可以使用()调用。

scala> class AddOne extends Function1[Int, Int] {
     |   def apply(m: Int): Int = m + 1
     | }
defined class AddOne

scala> val plusOne = new AddOne()
plusOne: AddOne = <function1>

scala> plusOne(1)
res0: Int = 2

可以使用更直观快捷的

extends (Int => Int)

代替

 extends Function1[Int, Int]
class AddOne extends (Int => Int) {
  def apply(m: Int): Int = m + 1
}

你可以将代码组织在包里。

package com.twitter.example

在文件头部定义包,会将文件中所有的代码声明在那个包中。

值和函数不能在类或单例对象之外定义。单例对象是组织静态函数(static function)的有效工具。

package com.twitter.example

object colorHolder {
  val BLUE = "Blue"
  val RED = "Red"
}

现在你可以直接访问这些成员

println("the color is: " + com.twitter.example.colorHolder.BLUE)

注意在你定义这个对象时 Scala 解释器的返回:

scala> object colorHolder {
     |   val Blue = "Blue"
     |   val Red = "Red"
     | }
defined module colorHolder

这暗示了 Scala 的设计者是把对象作为 Scala 的模块系统的一部分进行设计的。

模式匹配

这是 Scala 中最有用的部分之一。

匹配值

val times = 1

times match {
  case 1 => "one"
  case 2 => "two"
  case _ => "some other number"
}

使用守卫进行匹配

times match {
  case i if i == 1 => "one"
  case i if i == 2 => "two"
  case _ => "some other number"
}

注意我们是怎样将值赋给变量i的。

在最后一行指令中的_是一个通配符;它保证了我们可以处理所有的情况。

否则当传进一个不能被匹配的数字的时候,你将获得一个运行时错误。我们以后会继续讨论这个话题的。

匹配类型

你可以使用 match 来分别处理不同类型的值。

def bigger(o: Any): Any = {
  o match {
    case i: Int if i < 0 => i - 1
    case i: Int => i + 1
    case d: Double if d < 0.0 => d - 0.1
    case d: Double => d + 0.1
    case text: String => text + "s"
  }
}

匹配类成员

还记得我们之前的计算器吗。

让我们通过类型对它们进行分类。

def calcType(calc: Calculator) = calc match {
  case _ if calc.brand == "hp" && calc.model == "20B" => "financial"
  case _ if calc.brand == "hp" && calc.model == "48G" => "scientific"
  case _ if calc.brand == "hp" && calc.model == "30B" => "business"
  case _ => "unknown"
}

样本类 Case Classes

使用样本类可以方便得存储和匹配类的内容。你不用 new 关键字就可以创建它们。

scala> case class Calculator(brand: String, model: String)
defined class Calculator

scala> val hp20b = Calculator("hp", "20b")
hp20b: Calculator = Calculator(hp,20b)

样本类基于构造函数的参数,自动地实现了相等性和易读的 toString 方法。

scala> val hp20b = Calculator("hp", "20b")
hp20b: Calculator = Calculator(hp,20b)

scala> val hp20B = Calculator("hp", "20b")
hp20B: Calculator = Calculator(hp,20b)

scala> hp20b == hp20B
res6: Boolean = true

样本类也可以像普通类那样拥有方法。

使用样本类进行模式匹配

样本类就是被设计用在模式匹配中的。让我们简化之前的计算器分类器的例子。

val hp20b = Calculator("hp", "20B")
val hp30b = Calculator("hp", "30B")

def calcType(calc: Calculator) = calc match {
  case Calculator("hp", "20B") => "financial"
  case Calculator("hp", "48G") => "scientific"
  case Calculator("hp", "30B") => "business"
  case Calculator(ourBrand, ourModel) => "Calculator: %s %s is of unknown type".format(ourBrand, ourModel)
}

最后一句也可以这样写

 case Calculator(_, _) => "Calculator of unknown type"

或者我们完全可以不将匹配对象指定为 Calculator 类型

 case _ => "Calculator of unknown type"

或者我们也可以将匹配的值重新命名。

 case c@Calculator(_, _) => "Calculator: %s of unknown type".format(c)

异常

Scala 中的异常可以在 try-catch-finally 语法中通过模式匹配使用。

try {
  remoteCalculatorService.add(1, 2)
} catch {
  case e: ServerIsDownException => log.error
 (e,"the remote calculator service is unavailable. should have kept your trusty HP.")
} finally {
  remoteCalculatorService.close()
}

try 也是面向表达式的

val result: Int = try {
  remoteCalculatorService.add(1, 2)
} catch {
  case e: ServerIsDownException => {
    log.error(e,"the remote calculator service is unavailable. should have kept your trusty HP.")
    0
  }
} finally {
  remoteCalculatorService.close()
}

这并不是一个完美编程风格的展示,而只是一个例子,用来说明 try-catch-finally 和 Scala 中其他大部分事物一样是表达式。

当一个异常被捕获处理了,finally 块将被调用;它不是表达式的一部分。

由JSRUN为你提供的Scala在线运行、在线编译工具
        JSRUN提供的Scala 在线运行,Scala 在线运行工具,基于linux操作系统环境提供线上编译和线上运行,具有运行快速,运行结果与常用开发、生产环境保持一致的特点。
yout