小编Vin*_*gio的帖子

Scala - 复杂条件模式匹配

我有一个我要表达的声明,在C伪代码中看起来像这样:

switch(foo):
    case(1)
        if(x > y) {
            if (z == true)
                doSomething()
            }
            else {
                doSomethingElse()
            }
        return doSomethingElseEntirely()

    case(2)
        essentially more of the same
Run Code Online (Sandbox Code Playgroud)

使用scala模式匹配语法是一种很好的方法吗?

scala pattern-matching

16
推荐指数
1
解决办法
2万
查看次数

期货在计划终止前不会运行

我试图在新的Scala 2.10 期货功能上重现这个例子.我使用的代码是:

import scala.concurrent.Future
import scala.concurrent.future

object Test {
    def main(args: Array[String]) {
     println("Test print before future")
     val s = "Hello"
     val f = future {s + " future!"}
     f onSuccess {case v => println(v)}
     println("Test print after future")
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是打印:

Test print before future
Hello future!
Test print after future
Run Code Online (Sandbox Code Playgroud)

它只是打印:

Test print before future
Test print after future
Run Code Online (Sandbox Code Playgroud)

知道为什么我有这种行为吗?我的scala编译器版本是2.10.0-20120507.

concurrency scala future

9
推荐指数
1
解决办法
2999
查看次数

协变型T出现在不变位置

我正在移动我在Scala的第一步,我想使以下代码工作:

trait Gene[+T] {
    val gene: Array[T]
}
Run Code Online (Sandbox Code Playgroud)

编译器给出的错误是: covariant type T occurs in invariant position in type => Array[T] of value gene

我知道我可以这样做:

trait Gene[+T] {
    def gene[U >: T]: Array[U]
}
Run Code Online (Sandbox Code Playgroud)

但这并没有解决问题,因为我需要一个价值:实际上我想说的是"我不关心内部类型,我知道基因会有一个返回其内容的基因字段".(这里的+ T是因为我想做类似的东西type Genome = Array[Gene[Any]],然后用它作为单个基因类的包装器,所以我可以有一个异构数组类型)是否有可能在Scala中执行它或者我只是采取了错误的方法?使用不同的结构会更好吗,比如Scala本地协变类?

提前致谢!

PS:我也尝试过类和抽象类而不是特性,但总是一样的结果!

编辑:由迪迪埃杜邦的善意建议我来到这个代码:

package object ga {


  class Gene[+T](val gene: Vector[T]){

    def apply(idx: Int) = gene(idx)

    override def toString() = gene.toString

  }

  implicit def toGene[T](a: Vector[T]) = new Gene(a)

  type Genome = Array[Gene[Any]]

}
Run Code Online (Sandbox Code Playgroud)
package test

import ga._

object Test …
Run Code Online (Sandbox Code Playgroud)

scala invariants covariance

9
推荐指数
1
解决办法
5871
查看次数

Clojure BigInt不是Java BigInteger

我正在尝试在Clojure中使用BigDecimals来模拟(如果需要)任意精度数字.当我尝试从未缩放的值和比例因子实例化BigDecimal时,我有一个奇怪的错误:

user=> 1.31M
1.31M (OK)
user=> (class 1.31M)
java.math.BigDecimal (OK)
user=> (.unscaledValue 1.31M)
131 (OK)
user=> (.scale 1.31M)
2 (OK)
user=> (.movePointLeft (BigDecimal. 131) 2)
1.31M (OK)
user=> (BigDecimal. (BigInteger. "131") 2)
1.31M
user=> (BigDecimal. 131N 2) (WRONG!!!)
IllegalArgumentException No matching ctor found for class java.math.BigDecimal  clojure.lang.Reflector.invokeConstructor (Reflector.java:183)
user=> (BigDecimal. (BigInteger. "131") 2)
1.31M
Run Code Online (Sandbox Code Playgroud)

这里的问题是clojure大整数不是java.math.BigInteger对象.偶数(bigint x)不起作用:

user=> (doc bigint)
-------------------------
clojure.core/bigint
([x])
  Coerce to BigInt
nil
Run Code Online (Sandbox Code Playgroud)

顺便说一句,BigInteger构造函数不直接接受数值.我知道我也可以这样做:

user=> (BigDecimal. (BigInteger. (.toByteArray (.unscaledValue 1.31M))) (.scale 1.31M))
1.31M
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否有更惯用的方法直接管理来自Clojure的BigInteger对象?或者我坚持将所有内容都包装在自定义库中,例如:

user=> (defn my-bigint …
Run Code Online (Sandbox Code Playgroud)

clojure biginteger bigdecimal

7
推荐指数
1
解决办法
3037
查看次数

Scala中的'yield'是否等同于map函数?

我开始研究Scala编程语言.我对Erlang和Haskell等FP语言有一定的了解,我对for/yield表达式的含义有疑问,比如:

for (arg <- args) yield arg.length
Run Code Online (Sandbox Code Playgroud)

这将收集具有任何输入参数长度的数组.根据我的理解,这似乎是普通FP编程中的map函数:

map (\a -> a * 2) [1, 2, 3] (in Haskell)
Run Code Online (Sandbox Code Playgroud)

我知道Scala库包含scala.collection.map方法,所以我想知道:使用这两种风格有什么区别或限制,或者它们完全相同?

erlang haskell scala yield map

6
推荐指数
2
解决办法
1755
查看次数

Clojure地图限制和一致性

我想知道,考虑到Clojure使用32位散列进行映射实现,如果Clojure映射因此限制为2 ^ 32-1个键(如果不是这样,它如何管理冲突)以及它是否进行散列实施是一致的.TIA!

hash clojure hashmap map

6
推荐指数
1
解决办法
623
查看次数

如何正确解析时区的日期?

我正在尝试使用以下代码将一串文本转换为日期:

//Input String
str = "14/01/26,12:13:13+00"

//Format
format = new java.text.SimpleDateFormat("yy/MM/dd,HH:mm:ssz")

//Conversion
format.parse(str)
Run Code Online (Sandbox Code Playgroud)

但我得到以下内容:

例外:无法解释的日期:"14/01/26,12:13:13 + 00"

为了正确解析这个日期,我的格式如何更改?

parsing scala date simpledateformat

5
推荐指数
1
解决办法
1107
查看次数

Oracle 12 PCTUSED 和 PCTFREE 以及 INITRANS 和 MAXTRANS

我正在使用Oracle 12c,我想询问创建表中的这个参数。

我的应用程序在几个表中会进行大量的删除和插入,我认为这个参数不正确

PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
Run Code Online (Sandbox Code Playgroud)

指定较小的 的效果会减少和语句PCTUSED期间产生的处理成本,但较大的会增加和期间的处理成本UPDATEDELETEPCTUSEDINSERTUPDATE

我认为使用 0 是不正确的PCTUSED:默认值PCTUSED40%。根据文档。

DOC 中的另一点:

假设一个表通常被许多用户同时访问。在这种情况下,您可以考虑使用高 INITRANS 来预分配事务条目空间。这消除了在使用对象时必须分配事务条目空间的开销。另外,允许更高的 MAXTRANS,以便用户无需等待访问必要的数据块。

就我而言,它将是一个 Web 应用程序,其中有 <100 名用户同时工作。

database oracle oracle12c

5
推荐指数
1
解决办法
1万
查看次数

使用 Django 获取外部 URL 的标题和描述

我想知道如何使用它的 URL提取外部站点的TitleMetadescription。我找到了一些解决方案,但不适用于 django/python。

目前我的代码添加了一个指向数据库的链接,我想让它在添加后转到该链接,然后使用相应的Title和更新条目Metadescription

能够检索og诸如meta property="og:url.

谢谢你。

python django

2
推荐指数
1
解决办法
3323
查看次数

奇怪的Scala编译器警告

我在Scala Play Framework中有以下代码:

  case class Step(name: String, f: Unit) {
    def run = {() => f}
  }
Run Code Online (Sandbox Code Playgroud)

编译器给了我一个奇怪的警告

comparing values of type Unit and Unit using '==' will always yield true
Run Code Online (Sandbox Code Playgroud)

scala playframework

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