小编St.*_*rio的帖子

理解scala中的类和对象

我是scala的新手,现在我必须处理一个用scala和java编写的项目.我遇到了类似这样的结构:

class SomeType{
    //...
}

trait Trait1 extends scala.AnyRef{
}

trait Trait2 extends extends scala.AnyRef{
}

class MyClass(arg : SomeType) extends Trait1{
    //...
}

object MyClass extends Trait2{
    //...
}
Run Code Online (Sandbox Code Playgroud)

这有点麻木.据我所知,通过阅读这个答案,我们可以将objects视为仅使用抽象方法的类.即我们可以(在我看来)Class<T>在java中定义一些与对象的映射.

但在这个例子中classobject扩展了不同的 trait s.这就是我真正感到困惑的地方.我无法想象这意味着什么以及为什么使用它.

java scala

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

在每次测试之前运行方法

testng 6.11在以下测试类中使用和编写测试:

public class MyTest{

    public int i;

    public void init(){
        //initialize i
    }

    @Test
    public void test1(){
        //test some
    }

    @Test
    public void test2(){
        //Here I need fresh value of i as it would be
        //right after invocation of init()
        //...
        //test something else
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以init()在调用测试类中的每个测试之前使 testng run方法?

java testing testng

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

不带参数继承

我是Scala的新手并尝试使用以下继承:

abstract class Command(arg: Any)

case object Help extends Command // <---- Ok
Run Code Online (Sandbox Code Playgroud)

但如果我用这个代替它:

abstract class Command(arg: Option[Any])

case object Help extends Command // <---- Fail
Run Code Online (Sandbox Code Playgroud)

为什么?为什么它在第一个例子中工作?

inheritance scala case

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

为什么source使用char运行?

我是Scala的新手,想要scala.io.Source上课.但我发现它与Chars一起运行,但不是Bytes.我很困惑的是,Chars是编码/平台相关的.我的意思是我们可以编码UTF-8或"windows-1251"中编码的字符.

windows-1251 是严格的1字节编码...有没有办法使用原始字节操作?

io scala

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

有没有办法在链接列表的末尾按索引查找元素

我有一个非循环链表数据结构.像这样:

public class LinkLst<T>{
    private Node<T> first;

    public LinkLst(T t){
        first = new Node(t);
    }
}

public class Node<T>{
    private T t;
    private Node<T> next;

    public Node(T t){
        this.t = t;
    }

    public void setNext(Node<T> n){
         this.next = next;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我们默认知道List没有循环.有没有办法从结尾处找到第n个元素LinkLst<T> lst,只有一次迭代if n <= size(lst)和throw IndexOutOfBoundExceptionif n > size(lst).

public <T> T fromTheEnd(LinkLst<T> lst, int n){
   //...?
}
Run Code Online (Sandbox Code Playgroud)

我唯一能找到的是反转它然后找到所需的元素,但它需要2次迭代.一个用于反向,一个用于找到所需的元素.还有内存开销.

java linked-list

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

FS2流一直运行到InputStream的结尾

我是FS2的新手,需要有关设计的一些帮助。我正在尝试设计一个流,该流将从底层提取块InputStream直到结束。这是我尝试过的:

import java.io.{File, FileInputStream, InputStream}

import cats.effect.IO
import cats.effect.IO._

object Fs2 {

  def main(args: Array[String]): Unit = {
    val is = new FileInputStream(new File("/tmp/my-file.mf"))
    val stream = fs2.Stream.eval(read(is))
    stream.compile.drain.unsafeRunSync()
  }

  def read(is: InputStream): IO[Array[Byte]] = IO {
    val buf = new Array[Byte](4096)
    is.read(buf)
    println(new String(buf))
    buf
  }
}
Run Code Online (Sandbox Code Playgroud)

程序将打印第一个块。这是合理的。但是我想找到一种方法来“发出信号”在哪里停止阅读以及在哪里停止。我的意思是继续打电话read(is)直到结束。有办法实现吗?

我也尝试过,repeatEval(read(is)) 但它会一直读下去……我之间需要一些东西。

functional-programming scala scala-cats fs2

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

如何避免使用广义类型约束的强制转换?

我正在设计以下特征和方法:

trait Reader[T]{
  def read(): T
}

def rd[T, A](r: Reader[T])(implicit ev: T =:= Option[A]): Either[String, A] = r.read() match {
  case Some(a) => Right(a) // <---- compile error here
  case None => Left("End reached")
}
Run Code Online (Sandbox Code Playgroud)

问题是我在上面的代码中遇到了编译错误:

Error:(17, 27) type mismatch;
 found   : a.type (with underlying type Any)
 required: A
    case Some(a) => Right(a)
Run Code Online (Sandbox Code Playgroud)

但是当我明确地添加类型时,它会编译一个警告:

trait Reader[T]{
  def read(): T
}

def rd[T, A](r: Reader[T])(implicit ev: T =:= Option[A]): Either[String, A] = r.read() match {
  case Some(a: A) => Right(a) …
Run Code Online (Sandbox Code Playgroud)

types scala

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

如果某些条件满足,如何在for-understanding中产生None

我正在尝试理解并编写以下代码:

object Main extends App {
    val resultOption: Option[Int] = 
    for{
        i1 <- opt1
        i2 <- opt2
    } yield {
        if(i1 + i2 > 10) null.asInstanceOf[Int]
        else i1 + i2
    }

    println(resultOption) // <---- Here

    def opt1: Option[Int] = //some computations
    def opt2: Option[Int] = //some computations
}
Run Code Online (Sandbox Code Playgroud)

IDEONE工作示例

我希望resultOptionNone的情况下满足条件,但Some(0)返回.我查看了yield块的编译代码,我们在这里得到的是:

Code:
   0: aload_0
   1: getfield      #25                 // Field i1$1:I
   4: iload_1
   5: iadd
   6: bipush        10
   8: if_icmple     18
  11: aconst_null
  12: invokestatic  #31 …
Run Code Online (Sandbox Code Playgroud)

scala for-comprehension scala-option

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

按条件替换List中的元素

我有一个非常大val s: List[Int] = //...,一个功能f: Int => Boolean和一个功能transform: Int => Int.

问题:我想创造另一个List[Int],使得所有元素e: Int的的s: List[Int],这样f(e) = true与更换transform(e).

我看了一下cats-mtl FunctorEmpty(坚持函数编程风格),但它似乎不适用于我的情况.也许某些cats/ scalaz数据结构在这里有用吗?还是其他任何方式?

functional-programming scala list scalaz scala-cats

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

遍历Scala中的任何一个

我写了以下简单的代码:

import cats.effect.IO
import cats.instances.either._
import cats.syntax.TraverseSyntax

object Test extends App with TraverseSyntax{
  val e: Either[String, IO[Int]] = Right(IO(2))
  e.sequence //error here
}
Run Code Online (Sandbox Code Playgroud)

不幸的是它拒绝编译

Error:(25, 94) value sequence is not a member of scala.util.Either
Run Code Online (Sandbox Code Playgroud)

你能解释一下原因吗?我导入了either包含的实例Traverse[Either[A, ?]].怎么了?

functional-programming scala either scala-cats

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