我想使用函数初始化构造一次性生成以下数字序列:
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等等。如何复制第二个构造的值?
我也想不出能产生这种序列的数学函数。
我有一个 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)
但得到编译错误:
我有一个工作宏,即:
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)
现在我有一个错误: …
考虑到最佳实践,我试图在 Option 中获取值。例如,我有:
val listExample : List[Option[String]] = List(Some("A"), Some("B))
Run Code Online (Sandbox Code Playgroud)
我想访问A和B
一种方式,正在做listExample.head.get = "A",listExample.last.get = "B"
但这不是一个好习惯。怎么办:listExample.headOption.flatten.ToString
这安全吗?
假设我有一个看起来像这样的特征
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)
理想情况下,这应该过滤掉所有不属于的字段,Mytrait并z在这种情况下返回我。我尝试使用方差,但似乎isInstanceOf不一样
filterNot(x => x.isInstanceOf[+MyTrait])
Run Code Online (Sandbox Code Playgroud)
然而这是不可能的
val a …Run Code Online (Sandbox Code Playgroud) 我有如下代码:
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