在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设置或读取的方式,例如总是在屏幕上打印一些东西.我怎么能这样做,以便我的类的用户不受影响,并且如果在=符号之前使用空格,它没有任何区别?
假设我们有一个带有一些方法(静态或非静态)的groovy类.我想要做的是在调用此类的每个方法之前和之后执行一些代码,而根本不需要触及类,也不需要动态操作每个方法内部的代码.
我尝试使用groovy metaClass; 获取metaClass的所有方法,然后使用包装方法动态替换every方法,包含一些代码,并在中间调用旧方法.问题是,我不知道每个原始方法的参数,所以我不能用新方法(闭包)替换旧方法,因为我不能动态地创建具有不同数量和类型的参数的包装闭包,即使yi可以,我不知道如何在包装封口内访问它们.我需要包装闭包具有与旧方法相同的签名,以便在有人在透明地更改类之后尝试调用旧方法时调用闭包.
在Javascript中,我可以使用args []数组访问函数体中的所有参数,即使我在编写代码时不知道参数名称.
我怎么能在groovy做到这一点?或者他们可能是另一种方式来实现我的目标?
我有一个NonEmptyList实例,我想找到(按顺序)与谓词匹配的第一个元素.使用scalas List我可以做myList.find(predicate),但是scalaz NonEmptyList不支持这样的操作,所以这不适用于此.
这是为什么?
有没有比做更好的方法myNonEmptyList.toList.find(predicate)?
在下面的代码中,我尝试使用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) 我有一个类似的列表[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)
如果我可以采用不同的方式,我想避免将列表分配给变量.
可能有一些收集方法从我眼中滑落?
我有一个Disjunction具有相同类型的 scalaz ,Disjunction[String, String]我只想获得价值,无论它是什么。因此我使用了myDisjunction.fold(indentity, identity)但我想知道,有没有像这样的快捷方式myDisjunction.safeGetBecauseTypesAreEqual()?
当我想从http://groovy-lang.org/download.html下载 groovy 时,我得到了“二进制版本”。这意味着我有一个带有lib和bin和embeddable文件夹的目录结构。在bin文件夹中有一个groovyshell 脚本,让我可以执行我自己的 groovy 源文件。此groovyshell 脚本使用lib目录中的 jars 。但是,我希望它使用embeddable目录中groovy-all-jar 中的 jars 。原因是,我不希望jar在我的类路径中的目录中的所有 jars,因为我需要使用不同的版本。
如何groovy使用 groovy-all-jar制作shell 脚本?
scala ×4
groovy ×3
list ×2
scalaz ×2
class ×1
classpath ×1
closures ×1
collections ×1
duplicates ×1
getter ×1
implicit ×1
jar ×1
metaclass ×1
overriding ×1
reflection ×1
setter ×1
shapeless ×1
shell ×1
typeclass ×1