小编Mar*_*lic的帖子

一次性生成自定义图案编号序列

我想使用函数初始化构造一次性生成以下数字序列:

Array(0, 0, 0, 0, 3, 3, 6, 6, 9, 9, ..., n*3, n*3)
Run Code Online (Sandbox Code Playgroud)

一种方法是这样做:

Array.fill[Int](2)(0) ++ Array.tabulate(4)(_*3)
Run Code Online (Sandbox Code Playgroud)

但我需要将构造的第二部分的每个值加倍,即得到0, 0然后3, 3等等。如何复制第二个构造的值?

我也想不出能产生这种序列的数学函数。

arrays algorithm functional-programming scala

0
推荐指数
1
解决办法
127
查看次数

来自 trait 行为异常的 case 类继承

我有一个 traitPerson和一个继承自这个 trait 的 case 类,我希望如果我有一个函数,除了一个来自Personto的函数Future[Person],我会把它 func from MaletoFuture[Male]传递给那个函数。像这样:

trait Person {
  val name: String
  val age: Int
}

case class Male (override val name: String, override val age: Int, height: Double) extends Person

val male1 = Male(name = "John", age = 30, height = 1.80)

def something(person: Person => Future[Person]): Unit = {
  println(s"person is $person")
}

def maleToFutureMale (male: Male) = Future.successful(male)

something(maleToFutureMale)
Run Code Online (Sandbox Code Playgroud)

但得到编译错误:

在此处输入图片说明

scala variance

0
推荐指数
1
解决办法
111
查看次数

Def 宏,从一个值传递参数

我有一个工作宏,即:

object Main extends App {

  println("Testing assert macro...")
  val result = Asserts.assert(false, "abc")

}
Run Code Online (Sandbox Code Playgroud)

import scala.reflect.macros.blackbox.Context
import scala.language.experimental.macros

object Asserts {
  val assertionsEnabled: Boolean = true

  def assert(cond: Boolean, msg: String): Unit = macro assertImpl

  def assertImpl(c: Context)(cond: c.Expr[Boolean], msg: c.Expr[String]) : c.Expr[Unit] = {
    import c.universe._
    cond.tree match {
      case Literal(Constant(cond: Boolean)) =>
        if (!cond) c.abort(c.enclosingPosition, "Fix the code, whatever.") else c.Expr(q"()")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但问题是:我怎样才能做到这一点?:

  val cond: Boolean = false
  val result = Asserts.assert(cond, "abc")
Run Code Online (Sandbox Code Playgroud)

现在我有一个错误: …

scala scala-macros

0
推荐指数
1
解决办法
106
查看次数

从选项类型中获取价值的最佳和安全做法?

考虑到最佳实践,我试图在 Option 中获取值。例如,我有:

val listExample : List[Option[String]] = List(Some("A"), Some("B))
Run Code Online (Sandbox Code Playgroud)

我想访问AB 一种方式,正在做listExample.head.get = "A"listExample.last.get = "B"

但这不是一个好习惯。怎么办:listExample.headOption.flatten.ToString 这安全吗?

types scala list option scala-collections

0
推荐指数
1
解决办法
314
查看次数

确定子类中的非空附加字段

假设我有一个看起来像这样的特征

trait MyTrait {
  val x: Option[String] = None
  val y: Option[String] = None
}
Run Code Online (Sandbox Code Playgroud)

发布定义特征我将此特征扩展到一个MyClass看起来像这样的类

case class MyClass(
  override val x: Option[String] = None, 
  override val y: Option[String] = None, 
  z: Option[String] = None
) extends MyTrait
Run Code Online (Sandbox Code Playgroud)

现在我需要查找除了由MyTraitis not扩展的属性之外的任何其他属性None。从某种意义上说,如果我需要编写一个被调用的方法,该方法getClassInfo根据案例类中存在的值返回真/假。在这种情况下,如果z是非可选的,它应该返回 true 。我getClassInfo的事情是这样的

def getClassInfo(myClass: MyClass): Boolean = {
  myClass
    .productIterator
    .filterNot(x => x.isInstanceOf[MyTrait])
    .exists(_.isInstanceOf[Some[_]])
}

Run Code Online (Sandbox Code Playgroud)

理想情况下,这应该过滤掉所有不属于的字段,Mytraitz在这种情况下返回我。我尝试使用方差,但似乎isInstanceOf不一样

filterNot(x => x.isInstanceOf[+MyTrait])
Run Code Online (Sandbox Code Playgroud)

然而这是不可能的

val a …
Run Code Online (Sandbox Code Playgroud)

scala traits scala-option

0
推荐指数
1
解决办法
90
查看次数

使用下划线作为标识符时,隐式模式定义不绑定任何变量

我有如下代码:

implicit val _ = new MyClass()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Implicit pattern definition binds no variables
Run Code Online (Sandbox Code Playgroud)

为什么?

我正在使用 Scala -> 2.13.3、SBT -> 1.3.13 和 Java -> OpenJDK v14.0.2

scala implicit

0
推荐指数
1
解决办法
112
查看次数