小编dhg*_*dhg的帖子

Scala - 使用unapply进行隐式转换

我想要一个提取器来隐式转换它的参数,但它似乎不起作用.考虑这个非常简单的情况:

case class MyString(s: String) {}

implicit def string2mystring(x: String): MyString = new MyString(x)
implicit def mystring2string(x: MyString) = x.s

object Apply {
    def unapply(s: MyString): Option[String] = Some(s)
}
Run Code Online (Sandbox Code Playgroud)

但是我无法像我期望的那样使用它:

val Apply(z) = "a"  // error: scrutinee is incompatible with pattern type
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么它无法将参数转换StringMyString?我希望它可以string2mystring("a")即时通话.很明显,我可以解决这个问题val Apply(y) = MyString("a"),但似乎我不应该这样做.

注意:这个问题类似于这一个,而是1)一个不确实对为什么发生这种情况,2)的例子是比它需要更加复杂的一个很好的答案.

scala implicit-conversion unapply

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

Scala - 向Int添加unapply

我希望能够这样做:

scala> val Int(i) = "1"
i: Int = 1
Run Code Online (Sandbox Code Playgroud)

但是Int没有unapply方法.

我找到了这个答案,它给出了如何隐式地将方法添加到现有对象的说明,所以我试了一下.他们提供的解决方案有效,但遗憾的是不适用于模式匹配.这就是我所拥有的:

object UnapplyInt {
  val IntRE = """^(\d+)$""".r
  def unapply(v: String): Option[Int] = v match {
    case IntRE(s) => Some(s.toInt)
    case _ => None
  }
}
implicit def int2unapplyInt(objA: Int.type) = UnapplyInt
Run Code Online (Sandbox Code Playgroud)

这些测试用例都很好:

val UnapplyInt(i) = "1"       // pattern matching with unapply is fine
val i = Int.unapply("1").get  // implicit conversion is fine
Run Code Online (Sandbox Code Playgroud)

但我想要的那个失败了:

scala> val Int(i) = "1"
<console>:10: error: object Int …
Run Code Online (Sandbox Code Playgroud)

scala implicit-conversion unapply

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

来自 subprocess.Popen.communciate() 和 stdin 的断管

我在使用 subprocess.Popen.communicate() 时遇到了一个奇怪的问题。对于背景,我想从我的 python 脚本执行一个应用程序。当我从命令行运行程序时,我是这样做的(UNIX):

$ echo "输入文本" | /路径/到/我的应用程序

从我的脚本中,我还想将输入通过管道传输到应用程序中。所以,我尝试了以下方法。但是当我尝试使用通信()发送输入时,出现“管道损坏”错误:

>>> cmd = ['/path/to/myapp']
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
>>> out,err = p.communicate('输入文本')
回溯(最近一次调用最后一次):
  文件“”,第 1 行,在 
  文件“/usr/lib/python2.5/subprocess.py”,第 670 行,在通信中
    返回 self._communicate(input)
  文件“/usr/lib/python2.5/subprocess.py”,第 1223 行,在 _communicate
    bytes_written = self._write_no_intr(self.stdin.fileno(), buffer(input, input_offset, 512))
  文件“/usr/lib/python2.5/subprocess.py”,第 1003 行,在 _write_no_intr
    返回 os.write(fd, s)
OSError: [Errno 32] 管道损坏

更奇怪的是,如果我省略输入数据,我不会收到任何错误。但是,这并不是一个很好的解决方法,因为应用程序需要输入才能工作。

>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
>>> out,err = p.communicate()
>>> 打印出来
[来自 myapp 的关于缺少输入的错误]

知道我错过了什么吗?

python

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

Hadoop - 映射器的构造函数args

有没有办法在Hadoop中为Mapper提供构造函数args?可能通过一些包装创造就业的图书馆?

这是我的情景:

public class HadoopTest {

    // Extractor turns a line into a "feature"
    public static interface Extractor {
        public String extract(String s);
    }

    // A concrete Extractor, configurable with a constructor parameter
    public static class PrefixExtractor implements Extractor {
        private int endIndex;

        public PrefixExtractor(int endIndex) { this.endIndex = endIndex; }

        public String extract(String s) { return s.substring(0, this.endIndex); }
    }

    public static class Map extends Mapper<Object, Text, Text, Text> {
        private Extractor extractor;

        // Constructor configures the extractor
        public …
Run Code Online (Sandbox Code Playgroud)

java hadoop scala

6
推荐指数
3
解决办法
5539
查看次数

结合Scala选项[Iterable [_]]

我正在尝试将两个组合Option[Iterable[_]]成一个新的Option[Iterable[_]].如果其中一个(或两个)元素是Some和None,我想返回一个.似乎应该有一种惯用的做法,但我似乎无法找到一个.以下似乎做我想要的,但不是我希望的光滑解决方案.

def merge(
    i1: Option[Iterable[_]], i2: Option[Iterable[_]]
): Option[Iterable[_]] = (i1, i2) match {
   case (Some(as), Some(bs)) => Some(as ++ bs)
   case (a @ Some(as), None) => a
   case (None, b @ Some(bs)) => b
   case _ => None
}
Run Code Online (Sandbox Code Playgroud)

任何提示都表示赞赏.谢谢!

collections monads scala

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

在Scala中调用外部命令作为子进程

在Python中,如果我想将外部命令作为子进程调用,我会执行以下操作:

from subprocess import Popen, PIPE
cmd = ['cat', '-be']
out, err = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE).communicate("some input")
Run Code Online (Sandbox Code Playgroud)

在Scala中执行相同操作的标准方法是什么?使用Java的ProcessBuilder我提出了以下内容,但它非常难看:

def communicate(cmd: List[String], input: Option[String] = None): (String, String) = {

    val command = new java.util.ArrayList[String]()
    cmd.foreach(command.add(_))

    val builder = new ProcessBuilder(command)
    val process = builder.start()

    val stdinWriter = new java.io.PrintWriter((new java.io.OutputStreamWriter(new java.io.BufferedOutputStream(process.getOutputStream()))), true);
    val stdoutReader = new java.io.BufferedReader(new java.io.InputStreamReader(process.getInputStream()))
    val stderrReader = new java.io.BufferedReader(new java.io.InputStreamReader(process.getErrorStream()))

    input.foreach(stdinWriter.write(_))
    stdinWriter.close()

    def read(reader: java.io.BufferedReader): String = {
        val out = new ListBuffer[String]
        var line: …
Run Code Online (Sandbox Code Playgroud)

subprocess scala

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

Scala - 从DSL的apply方法中省略括号

我正在尝试创建一个DSL并遇到问题.我有这些定义:

case class Var(name: String)
case class Lam(v: Var, t: Var)
val (a, b) = (Var("a"), Var("b"))
Run Code Online (Sandbox Code Playgroud)

我希望能够这样做:

scala> \ a b
Lam(Var(a),Var(b))
Run Code Online (Sandbox Code Playgroud)

阅读括号删除规则,我发现我需要链接每个都带有一个参数的函数,所以我创建了一系列执行构造的"构建器"类:

class LamBuilderB(v: Var) {
    def apply(t: Var) = Lam(v, t)
}

class LamBuilderA {
    def apply(v: Var) = new LamBuilderB(v)
}

val \ = new LamBuilderA
Run Code Online (Sandbox Code Playgroud)

我曾希望这会有效,因为每个人apply只需要一个论点.但是,似乎放弃括号是合法的,apply因为它想将参数视为方法名称:

scala> \(a)(b)
res95: Lam = Lam(Var(a),Var(b))

scala> \ a b
error: value a is not a member of LamBuilderA
    \ a b
      ^
Run Code Online (Sandbox Code Playgroud)

有没有想法如何在没有括号的情况下获得DSL语法?

奖金问题 …

dsl scala apply

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

Scala:错误:缺少参数类型

我正在尝试编写一些库函数来增强基本集合.大部分都进​​展顺利,但我遇到了这个问题.

class EnhancedGenTraversableLike[A, Repr <: GenTraversable[A]](self: GenTraversableLike[A, Repr]) {
  def mapValuesStrict[T, U, R, That](f: U => R)(implicit ev: A <:< (T, U), bf: CanBuildFrom[Repr, (T, R), That]) = {
    val b = bf(self.asInstanceOf[Repr])
    b.sizeHint(self.size)
    for ((k: T, v: U) <- self) b += k -> f(v)
    b.result
  }
}
implicit def enhanceGenTraversableLike[A, Repr <: GenTraversable[A]](self: GenTraversableLike[A, Repr]) = new EnhancedGenTraversableLike[A, Repr](self)
Run Code Online (Sandbox Code Playgroud)

这是我去使用它时会发生什么:

scala> List((1,2),(2,3),(3,4),(2,5)).mapValuesStrict((_:Int).toString)
res0: List[(Int, java.lang.String)] = List((1,2), (2,3), (3,4), (2,5))

scala> List((1,2),(2,3),(3,4),(2,5)).mapValuesStrict(x => x.toString)
<console>:13: error: missing parameter …
Run Code Online (Sandbox Code Playgroud)

scala

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

Scala - 计算目录中具有已定义文件扩展名的文件数

嗨,我有一个脚本批量转换pdfs为一系列图像,我想做的是计算目录中扩展名为.jpg的文件总数.

到目前为止我有

for (file <- new File(path).listFiles) {

     /* DO SOMETHING */

}
Run Code Online (Sandbox Code Playgroud)

有没有一种紧凑的方式来做到这一点而不循环遍历每个文件?

在此先感谢,非常感谢:)

scala file

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

基本Scala for循环问题

我正在尝试学习scala,这里我使用的是基本for循环,但是我在编译时遇到错误.

object App {    
  def main(args: Array[String]) {

    for (i <- 1 to 10; i % 2 == 0)
      Console.println("Counting " + i)

  }
}
Run Code Online (Sandbox Code Playgroud)

编译时出错:

fortest.scala:5: error: '<-' expected but ')' found.

    for (i <- 1 to 10; i % 2 == 0)
                                 ^
fortest.scala:7: error: illegal start of simple expression

  }
  ^

two errors found
Run Code Online (Sandbox Code Playgroud)

我使用的是scala版本2.9.1

不知道是什么问题..............?

scala

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