Scala newb ......我很困惑
object myApp extends App {
println("Echo" + (args mkString " "))
}
Run Code Online (Sandbox Code Playgroud)
"args"是类型Array [String],但在scaladoc中,Array没有这样的方法.mkString是Vector的一种方法,但我没有看到两者之间的任何继承链接.那么为什么我们可以在args上使用mkString方法呢?
在Scala中的Programming中,它描述了如何从批处理文件(链接)运行Scala脚本.
对于Windows
::#!
@echo off
call scala %0 %*
goto :eof
::!#
Run Code Online (Sandbox Code Playgroud)
我有一个问题谷歌搜索::#!.这是什么意思?我知道::表示一个注释,在Unix中#!是shell的使用方向,但这究竟是什么?而且::!#?
究竟是什么%0 %*意思,是否有必要像这样表达?
是否可以从同一批处理文件中运行多个脚本?
如果你有像a这样的可变数据结构Array,是否可以使用map操作或类似的东西来改变它的值?
说我有val a = Array(5, 1, 3),最好的说法,从每个值中减去1?我想出的最好的是
for(i <- 0 until a.size) { a(i) = a(i) - 1 }
Run Code Online (Sandbox Code Playgroud)
我想方法是使数组成为一个var而不是一个val我可以说的
a = a map (_-1)
Run Code Online (Sandbox Code Playgroud)
编辑:如果内置任何内容,相当容易自己滚动,虽然我不知道如何推广到其他可变集合
scala> implicit def ArrayToMutator[T](a: Array[T]) = new {
| def mutate(f: T => T) = a.indices.foreach {i => a(i) = f(a(i))}
| }
ArrayToMutator: [T](a: Array[T])java.lang.Object{def mutate(f: (T) => T): Unit}
scala> val a = Array(5, 1, 3)
a: Array[Int] = Array(5, 1, 3) …Run Code Online (Sandbox Code Playgroud) 我实现了一个三元运算符如Java的<condition> ? <if true> : <if false>,替代/的:,因为:不是一个有效的标识符:
case class Ternary[T](val o: Option[T]) {
def / (f: => T) = o getOrElse f
}
implicit def boolToTernary(cond: Boolean) = new {
def ? [T](f: => T) = if(cond) Ternary(Some(f))
else Ternary[T](None)
}
Run Code Online (Sandbox Code Playgroud)
它一般工作正常,例如
scala> (1 > 2) ? "hi" / "abc"
res9: java.lang.String = abc
Run Code Online (Sandbox Code Playgroud)
但在以下情况下跌倒:
scala> (1 > 2) ? 5 / 6.0
<console>:33: error: type mismatch;
found : Double(6.0)
required: Int …Run Code Online (Sandbox Code Playgroud) 例如,如果我想写
1 -> 2 match {
case 1 -> 2 => "matched"
case _ => "not matched"
}
// error: not found: value ->
Run Code Online (Sandbox Code Playgroud)
而不是稍微不那么明显
1 -> 2 match {
case (1, 2) => "matched"
case _ => "not matched"
}
Run Code Online (Sandbox Code Playgroud) 之前已经问过这个问题,但答案并没有解决问题,所以我再问一遍.
有人建议,而不是使用g2.drawLine,你可以使用g2.draw(line),其中line一个Line2D.Double.但是,正如您从屏幕截图中看到的那样,线仍然被绘制为好像它们以整数像素结束(每组10条线完全平行).
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Line2D;
public class FrameTestBase extends JFrame {
public static void main(String args[]) {
FrameTestBase t = new FrameTestBase();
t.add(new JComponent() {
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
for (int i = 0; i < 50; i++) {
double delta = i / 10.0;
double y = 5 + 5*i;
Shape l = new Line2D.Double(5, y, 200, y + …Run Code Online (Sandbox Code Playgroud) 每次我对现有数据运行胶水爬虫时,它都会将 Serde 序列化库更改为LazySimpleSerDe,这不能正确分类(例如,对于带逗号的引用字段)
然后,我需要手动编辑 Glue Catalog 中的表格详细信息,将其更改为org.apache.hadoop.hive.serde2.OpenCSVSerde.
我尝试制作自己的 csv 分类器,但这没有帮助。
如何让爬虫为生成或更新的表指定特定的序列化库?
amazon-web-services amazon-athena aws-glue aws-glue-data-catalog
import swing._
object PeerTest extends SimpleSwingApplication {
def top = new MainFrame {
val p = peer.getMousePosition
}
}
Run Code Online (Sandbox Code Playgroud)
给
error: ambiguous reference to overloaded definition,
both method getMousePosition in class Container of type (x$1: Boolean)java.awt.Point
and method getMousePosition in class Component of type ()java.awt.Point
match expected type ?
val p = peer.getMousePosition
Run Code Online (Sandbox Code Playgroud)
但添加类型
val p: Point = peer.getMousePosition
Run Code Online (Sandbox Code Playgroud)
没事.为什么?
编辑:导致问题:
class A {
def value() = 123
}
class B extends A {
def value(b: Boolean) = 42 …Run Code Online (Sandbox Code Playgroud) 是否有正则表达式将捕获表达式的所有实例,无论它们是否重叠?
例如,/abc/def/ghi如果我想捕获所有以字符串开头的字符串/.正则表达式(/.*)只返回整个字符串,但我希望它匹配/def/ghi和/ghi为好.
有没有办法在不使用临时变量和启动新语句的情况下操作元组的多个值?
假设我有一个方法返回一个元组,我想用内联这些值做一些事情.
例如,如果我想在某个点拆分一个字符串并反转这些部分
def backToFront(s: String, n:Int) = s.splitAt(n)...
Run Code Online (Sandbox Code Playgroud)
我可以
val (a, b) = s.splitAt(n)
b + a
Run Code Online (Sandbox Code Playgroud)
(需要临时变量和新声明)或
List(s.splitAt(n)).map(i => i._2 + i._1).head
Run Code Online (Sandbox Code Playgroud)
(工作,但似乎有点脏,为此创建一个单独的元素列表)或
s.splitAt(n).swap.productIterator.mkString
Run Code Online (Sandbox Code Playgroud)
(适用于这个特定的例子,但只是因为碰巧有一种swap方法可以做我想要的,所以它不是很一般).
zipped关于元组的方法似乎只适用于列表元组.
另一个例子,你怎么能把元组('a, 'b, 'c)变成('b, 'a, 'c)一个声明?