根据价值类的文件,它们可能在许多情况下分配:
分配摘要
值类被视为另一种类型.
值类被分配给数组.
进行运行时类型测试,例如模式匹配.
无论如何说,如果出现这些情况,会抛出编译错误吗?
我试图创建一个新的运算符:?在列表上,其操作与::相同,但如果值为null,则返回原始列表.我写了以下内容,但很快就知道我不知道自己在做什么......
object ImplicitList {
implicit def extendIterator[T](i : List[T]) = new ListExtension(i)
}
class ListExtension[T <: Any](i : List[T]) {
def :?[B >: T] (x: B): List[B] = if (x != null) x :: i else i
}
final case class :?[B](private val hd: B, private val tl: ListExtension[B]) extends ListExtension[B](tl.:?(hd))
Run Code Online (Sandbox Code Playgroud) 我想知道是否有一个简短的手来折叠选项的地图.例如
def divideByThree(x:Int) = if (x == 0) None else Some(x/3)
val result = Some(6) map (divideByThree(_))
resut:Option[Option[Int]] = Some(Some(2))
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题我做了
val result = Some(6) match {
case Some(i) => divideByThree(i)
case None => None
}
Run Code Online (Sandbox Code Playgroud)
这看起来有点沉重.我可以在Option上创建一个隐式函数map mapOption来解决这个问题,但我想知道是否有一种我没有想过的更好的方法.
我想将可遍历的一次连接到可遍历的一次而不解决任何一次.这是我提出的一个隐含的解决方案,但我不知道我是否缺少原生解决方案......
object ImplicitTraversableOnce {
implicit def extendTraversableOnce[T](t : TraversableOnce[T]) = new TraversableOnceExtension(t)
}
class TraversableOnceExtension[T <: Any](t : TraversableOnce[T]) {
def ++ (t2:TraversableOnce[T]):TraversableOnce[T] = new concat(t.toIterator, t2.toIterator)
private class concat(i1:Iterator[T], i2:Iterator[T]) extends Iterator[T] {
private var isOnSecond = false
def hasNext:Boolean =
if (isOnSecond) i2.hasNext
else if (!i1.hasNext) {
isOnSecond = true
hasNext
}
else true
def next():T = if (isOnSecond) i2.next() else i1.next()
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个 javascript 脚本,它在评估时返回一个 NativeObject
obj = context.evaluateString(scope,"({age:3, name:'bob'})", "<source">, 1, null)
Run Code Online (Sandbox Code Playgroud)
然后我将 obj 转换为 NativeObject 或 Map,然后运行 put 方法
castObj.put("surname","smith")
Run Code Online (Sandbox Code Playgroud)
我得到一个 java.lang.UnsupportedOperationException 抛出。还有另一种方法可以更改对象值吗?
我有一个功能的类
case class FunctionParser1Arg[T, U](func:(T => U))
def testFunc(name1:String):String = name1
val res = FunctionParser1Arg(testFunc)
Run Code Online (Sandbox Code Playgroud)
我想知道case类中的函数类型签名信息.我想知道参数名称和类型.我已成功使用运行时镜像对象查找类型,但不是名称.有什么建议?
鉴于monocle 项目中的JsonExample,我想创建一个镜头,其中 set 调用将替换键/值对中的值,或者创建键/值对(如果它不存在)。
然而,这似乎用索引(可以构成类型安全)或 at 表示,它不是类型安全的
//for replacing:
(jsObject composeOptional index("age") composePrism jsNumber).set(45)
//for creating:
(jsObject composeLens at("age")).set(JsNumber(45)) <- will accept any old json
Run Code Online (Sandbox Code Playgroud)
我所追求的可能吗?
我也可以扩展它,如果年龄嵌套在另一个 JsObject 中,例如:
val n = (jsObject composeOptional index("nested") composePrism
jsObject composeOptional index("age") composePrism jsNumber).set(45)
Run Code Online (Sandbox Code Playgroud)
在“嵌套”的键/值对尚不存在的情况下,它将在嵌套处创建对象,然后添加字段
n(JsObject(Map.empty)) -> JsObject(Map("nested" -> JsObject("age" -> JsNumber(45)))
Run Code Online (Sandbox Code Playgroud) 给定一个数据结构如下:
{"single":"someText", "many":["text1", text2"]}
Run Code Online (Sandbox Code Playgroud)
我可以查询单个正则表达式
WHERE JsonBColumn ->> 'single' ~ '^some.*'
Run Code Online (Sandbox Code Playgroud)
我可以查询数组上的包含匹配
WHERE JsonBColumn -> 'many' ? 'text2'
Run Code Online (Sandbox Code Playgroud)
我想做的是用 JArray 上的正则表达式进行包含匹配
WHERE JsonBColumn -> 'many' {Something} '.*2$'
Run Code Online (Sandbox Code Playgroud) scala ×6
coalesce ×1
extending ×1
iterator ×1
java ×1
jsonb ×1
list ×1
postgresql ×1
reflection ×1
regex ×1
rhino ×1
scala-option ×1
value-class ×1