小编val*_*rry的帖子

使用自定义_ =进行Scala自动getter和setter覆盖

在scala中,类的用户在调用方法或使用val x = myclass.myproperty直接访问某个字段/成员之间没有区别.为了能够控制例如设置或获取字段,scala让我们覆盖_ =方法.但是=真的是一种方法吗?我很迷惑.

我们来看下面的代码:

class Car(var miles: Int)

var myCar = new Car(10)
println(myCar.miles) //prints 10
myCar.miles = 50
println(myCar.miles) //prints 50
Run Code Online (Sandbox Code Playgroud)

此代码也是如此(注意双空格myCar.miles = 50):

class Car(var miles: Int)

var myCar = new Car(10)
println(myCar.miles) //prints 10
myCar.miles  = 50
println(myCar.miles) //still prints 50
Run Code Online (Sandbox Code Playgroud)

现在我想改变如何miles设置或读取的方式,例如总是在屏幕上打印一些东西.我怎么能这样做,以便我的类的用户不受影响,并且如果在=符号之前使用空格,它没有任何区别?

getter setter overriding scala class

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

Groovy:在调用任何方法之前和之后,执行代码是透明的

假设我们有一个带有一些方法(静态或非静态)的groovy类.我想要做的是在调用此类的每个方法之前和之后执行一些代码,而根本不需要触及类,也不需要动态操作每个方法内部的代码.

我尝试使用groovy metaClass; 获取metaClass的所有方法,然后使用包装方法动态替换every方法,包含一些代码,并在中间调用旧方法.问题是,我不知道每个原始方法的参数,所以我不能用新方法(闭包)替换旧方法,因为我不能动态地创建具有不同数量和类型的参数的包装闭包,即使yi可以,我不知道如何在包装封口内访问它们.我需要包装闭包具有与旧方法相同的签名,以便在有人在透明地更改类之后尝试调用旧方法时调用闭包.

在Javascript中,我可以使用args []数组访问函数体中的所有参数,即使我在编写代码时不知道参数名称.

我怎么能在groovy做到这一点?或者他们可能是另一种方式来实现我的目标?

reflection groovy closures metaclass

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

为什么scalaz.NonEmptyList不支持像"find"这样的常见列表操作

我有一个NonEmptyList实例,我想找到(按顺序)与谓词匹配的第一个元素.使用scalas List我可以做myList.find(predicate),但是scalaz NonEmptyList不支持这样的操作,所以这不适用于此.

这是为什么?

有没有比做更好的方法myNonEmptyList.toList.find(predicate)

scala list scalaz

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

为什么scalac在这里出现"分歧的隐式扩展"错误?

在下面的代码中,我尝试使用shapeless派生类型类实例.但是,在更复杂的案例类(转换为更复杂的HList)的情况下,编译器给我一个"分歧的隐式扩展",即使它似乎没有两次解析相同类型的隐式类型.也许我错过了编译器的其他一些规则?

(小提琴:https://scalafiddle.io/sf/WEpnAXN/0)

import shapeless._

trait TC[T]

sealed trait Trait1
case class SimpleClass(a: String) extends Trait1

sealed trait Trait2
case class ComplexClass(a: String, b: String) extends Trait2

object Serialization extends App {

    //Instances for HList
    implicit val hnilInstance: TC[HNil] = ???
    implicit def hconsInstance[H, T <: HList] (implicit t: TC[T]): TC[H :: T] = ???

    //Instances for CoProduct
    implicit val cnilInstance: TC[CNil] = ???
    implicit def cconsInstance[H, T <: Coproduct] (implicit h: TC[H], t: TC[T]): TC[H :+: …
Run Code Online (Sandbox Code Playgroud)

scala implicit typeclass shapeless

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

如何获取我在groovy中迭代的列表的引用

我有一个类似的列表[0, 1, 2, 3, 4, 2, 1],我想为此列表中相等的每个元素元组打印一条警告消息.所以鉴于上面的列表我想做点什么

[0, 1, 2, 3, 4, 2, 1].someMethodIDontKnow { Int num, List owner ->
    if(owner.contains(num)) println "warning, multiple "+ num +" detected"
    println it
}
Run Code Online (Sandbox Code Playgroud)

我当然可以保存列表然后这样做:

List<Int> numlist = [0, 1, 2, 3, 4, 2, 1]
numlist.each {
    if (numList.contains(it)) println "warning, multiple "+ it +" detected"
    println it
}
Run Code Online (Sandbox Code Playgroud)

但这并不像之前的代码那样简洁,特别是当它发生在其他类似的调用中时:

List somelist
//...
somelist
.findAll{...}
.intersect{...}
//check for some warnings here
.collect{...}
.unique{...}
Run Code Online (Sandbox Code Playgroud)

如果我可以采用不同的方式,我想避免将列表分配给变量.

可能有一些收集方法从我眼中滑落?

collections groovy functional-programming list duplicates

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

Disjunction.fold(identity, identity) 有快捷方式吗?

我有一个Disjunction具有相同类型的 scalaz ,Disjunction[String, String]我只想获得价值,无论它是什么。因此我使用了myDisjunction.fold(indentity, identity)但我想知道,有没有像这样的快捷方式myDisjunction.safeGetBecauseTypesAreEqual()

scala scalaz

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

groovy 二进制版本 vs groovy-all-jar

当我想从http://groovy-lang.org/download.html下载 groovy 时,我得到了“二进制版本”。这意味着我有一个带有libbinembeddable文件夹的目录结构。在bin文件夹中有一个groovyshell 脚本,让我可以执行我自己的 groovy 源文件。此groovyshell 脚本使用lib目录中的 jars 。但是,我希望它使用embeddable目录中groovy-all-jar 中的 jars 。原因是,我不希望jar在我的类路径中的目录中的所有 jars,因为我需要使用不同的版本。

如何groovy使用 groovy-all-jar制作shell 脚本?

shell groovy jar classpath

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