我仍然是Scala的新手,我几乎每天都在发现新的有趣的做事方式,但它们并不总是明智的,有时候已经存在于语言中作为一种结构而我只是不喜欢知道他们.所以,有了这个序言,我正在检查一个给定的字符串是否完全由数字组成,所以我在做:
def isAllDigits(x: String) = x.map(Character.isDigit(_)).reduce(_&&_)
Run Code Online (Sandbox Code Playgroud)
这是明智的还是不必要的愚蠢?有更好的方法吗?调用x.toInt并捕获异常更好,还是不那么惯用?是否存在性能优势/劣势?
我是Scala的新手,我正在使用2.9.1,而我正试图了解如何使用部分功能.我对curried函数有一个基本的了解,我知道部分函数有点像curried函数,它们只有2nary或者其他类似函数.你可以告诉我,我有点绿.
看起来在某些情况下,比如XML过滤,能够部分功能是非常有利的,所以我希望能更好地理解如何使用它们.
我有一个使用RewriteRule结构的函数,但我需要它使用两个参数,而RewriteRule结构只需要一个,或一个部分函数.我认为这是我认为它有用的案例之一.
任何建议,链接,智慧的话等欢迎!
到目前为止,答案非常好,并且澄清了我的一些基本误解.我认为他们也解释了我在哪里挣扎 - 我想也许发布一个更具体的新问题会有所帮助,所以我也会这样做.
我刚刚开始使用play,我修改了我正在进行SQL读取的方式,现在我收到以下错误:
[Exception: DB plugin is not registered.]
Run Code Online (Sandbox Code Playgroud)
我给这个类的代码是:
package models
import play.api.db._
import play.api.Play.current
import anorm._
case class Housing(id: Long, rent: String, address: String, street0: String, street1: String, neighbourhood: String)
object Housing {
def all(): List[Housing] = DB.withConnection { implicit c =>
SQL("select * from housing")().map { row =>
Housing(row[Long]("id"), row[String]("rent"), row[String]("address"), row[String]("street0"),
row[String]("street1"), row[String]("neighbourhood"))
}.toList
}
def create(rent: String, address: String, street0: String, street1: String, neighbourhood: String) {}
def delete(id: Long) {}
}
Run Code Online (Sandbox Code Playgroud)
我不确定这甚至是最好的方法,但使用〜链似乎我最终会复制一堆东西.
我试图看一些JPA orm.xml的使用示例.如果有人指导我链接,
我正在制作一个Monoid用于组合重试执行的策略,而RetryExecutor [T]是基于类型.我已经定义了以下基类型和一个monoid:
trait RetryExecutor[C] {
def retry[T](f: C => T)(context: C): T
def predicate: Option[Throwable]
def application: Unit
val retryEligible: PartialFunction[Throwable, Boolean]
}
object RetryExecutor {
implicit def retryExecutorMonoid[A] = new Monoid[RetryExecutor[A]] {
...
}
Run Code Online (Sandbox Code Playgroud)
和一些基本类型,如:
case class LinearDelayingRetryExecutor[C](delayInMillis: Long)(val retryEligible: PartialFunction[Throwable, Boolean]) extends RetryExecutor[C] {
override def predicate: Option[Throwable] = None
override def application = Thread.sleep(delayInMillis)
}
case class RetryWithCountExecutor[C](maximumRetries: Int)(val retryEligible: PartialFunction[Throwable, Boolean])(implicit val logger: Logger) extends RetryExecutor[C] {
var remainingTries = maximumRetries + 1
override def application: …Run Code Online (Sandbox Code Playgroud) 我正在尝试测试用户登录的典型控制器流程.与大多数登录系统一样,存在扩展关系,Grails文档完全没用.它没有一个与典型用法实际相关的实例,并且是一个功能完整的示例.
我的测试看起来像这样:
@TestFor(UserController)
class UserControllerTests extends GroovyTestCase {
void testLogin() {
params.login = [email: "test1@example.com", password: "123"]
controller.login()
assert "/user/main" == response.redirectUrl
}
}
Run Code Online (Sandbox Code Playgroud)
控制器执行:
def login() {
if (!params.login) {
return
}
println("Email " + params.login.email)
Person p = Person.findByEmail(params?.login?.email)
...
}
Run Code Online (Sandbox Code Playgroud)
失败的是:
groovy.lang.MissingMethodException:没有方法签名:immigration.Person.methodMissing()适用于参数类型:()值:[]
println中显示了正确的数据,但无法调用该方法.
测试套件不能整体使用模拟,因为有数据库触发器被调用,其结果需要进行测试.
奇怪的是,如果我在测试中直接调用该方法,它可以工作,但在控制器中调用它不会.
对于更新:我直接从grails命令重新生成测试,并添加了@Test注释:
@TestFor(UserController)
class UserControllerTests extends GroovyTestCase {
@Test
void testLogin() {
params.login = [email: "test1@example.com", password: "123"]
Person.findByEmail(params.login.email)
controller.login()
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用grail test-app -integration UserController运行它,这是有效的
虽然结果没有正确填充 - 响应为空,flash.message为null,即使它应该有一个值,redirectedUrl为null,内容主体为空,视图也是如此.
如果我删除@TestFor注释,它甚至没有丝毫的作用.它没有告诉我'params'不存在.
在另一个测试中,我有两种方法.第一个方法运行,找到Person.findAllByEmail(),然后第二个方法运行,找不到Person.findAllByEmail并崩溃类似的错误 - 方法丢失. …