我想要一个提取器来隐式转换它的参数,但它似乎不起作用.考虑这个非常简单的情况:
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)
任何人都可以解释为什么它无法将参数转换String为MyString?我希望它可以string2mystring("a")即时通话.很明显,我可以解决这个问题val Apply(y) = MyString("a"),但似乎我不应该这样做.
注意:这个问题类似于这一个,而是1)一个不确实对为什么发生这种情况,2)的例子是比它需要更加复杂的一个很好的答案.
我希望能够这样做:
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) 我在使用 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 的关于缺少输入的错误]
知道我错过了什么吗?
有没有办法在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) 我正在尝试将两个组合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)
任何提示都表示赞赏.谢谢!
在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) 我正在尝试创建一个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语法?
奖金问题 …
我正在尝试编写一些库函数来增强基本集合.大部分都进展顺利,但我遇到了这个问题.
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) 嗨,我有一个脚本批量转换pdfs为一系列图像,我想做的是计算目录中扩展名为.jpg的文件总数.
到目前为止我有
for (file <- new File(path).listFiles) {
/* DO SOMETHING */
}
Run Code Online (Sandbox Code Playgroud)
有没有一种紧凑的方式来做到这一点而不循环遍历每个文件?
在此先感谢,非常感谢:)
我正在尝试学习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
不知道是什么问题..............?