在Scala中连接列表:::和++列表之间是否有任何区别?
scala> List(1,2,3) ++ List(4,5)
res0: List[Int] = List(1, 2, 3, 4, 5)
scala> List(1,2,3) ::: List(4,5)
res1: List[Int] = List(1, 2, 3, 4, 5)
scala> res0 == res1
res2: Boolean = true
Run Code Online (Sandbox Code Playgroud)
从文档看起来++是更普遍的,而:::是List特异性的.提供后者是因为它用于其他功能语言吗?
我注意到当我加载文本文件时,Notepad ++将识别并使用该文件中的换行符,\n或者\r\n.
是否有一些选项可以选择在新文档中使用哪个?(我看了帮助和谷歌搜索,但找不到任何东西.)
所以Scala应该和Java一样快.我正在重新审视我最初用Java解决的Scala中的一些Project Euler问题.具体问题5:"从1到20的所有数字均可被整除的最小正数是多少?"
这是我的Java解决方案,在我的机器上完成需要0.7秒:
public class P005_evenly_divisible implements Runnable{
final int t = 20;
public void run() {
int i = 10;
while(!isEvenlyDivisible(i, t)){
i += 2;
}
System.out.println(i);
}
boolean isEvenlyDivisible(int a, int b){
for (int i = 2; i <= b; i++) {
if (a % i != 0)
return false;
}
return true;
}
public static void main(String[] args) {
new P005_evenly_divisible().run();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我对Scala的"直接翻译",需要103秒(147倍!)
object P005_JavaStyle {
val t:Int = 20;
def run {
var …Run Code Online (Sandbox Code Playgroud) 说我正在写一个扩展方法
implicit class EnhancedFoo(foo: Foo) {
def bar() { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
你应该总是extends AnyVal在课堂上定义吗?在什么情况下你不想让隐式类成为一个值类?
我觉得很困惑的一件事是知道我可以在方法和变量名中使用哪些字符和组合.例如
val #^ = 1 // legal
val # = 1 // illegal
val + = 1 // legal
val &+ = 1 // legal
val &2 = 1 // illegal
val £2 = 1 // legal
val ¬ = 1 // legal
Run Code Online (Sandbox Code Playgroud)
据我了解,字母数字标识符和运算符标识符之间存在区别.除非用下划线(混合标识符)分隔,否则您可以将一个匹配或另一个匹配但不能同时混合.
从Scala中的编程 6.10节,
运算符标识符由一个或多个运算符字符组成.运算符字符是可打印的ASCII字符,例如+,:,?,〜或#.
更确切地说,运算符字符属于Unicode数学符号集(Sm)或其他符号(So),或者不是字母,数字,括号,方括号,花括号,单个或双精度的7位ASCII字符引号,或下划线,句号,分号,逗号或后退字符.
所以我们被排除在使用()[]{}'"_.;,和`之外
我抬起头,统一的数学符号的维基百科,但我发现没有包括的那些+,:,?等是否有一个明确的清单某处的运营商角色是什么?
此外,任何想法为什么Unicode数学运算符(而不是符号)不算作运算符?
说我有一个功能,例如旧的最爱
def factorial(n:Int) = (BigInt(1) /: (1 to n)) (_*_)
Run Code Online (Sandbox Code Playgroud)
现在,我想找到的最大的价值n为它factorial(n)镶嵌在长.我可以
(1 to 100) takeWhile (factorial(_) <= Long.MaxValue) last
Run Code Online (Sandbox Code Playgroud)
这是有效的,但100是任意大数; 在左侧我真正想要的是一个无限的流,它会一直产生更高的数字,直到满足takeWhile条件.
我想出来了
val s = Stream.continually(1).zipWithIndex.map(p => p._1 + p._2)
Run Code Online (Sandbox Code Playgroud)
但有更好的方法吗?
(我也知道我可以递归地得到一个解决方案,但这不是我正在寻找的.)
在REPL中,我定义了一个函数.请注意返回类型.
scala> def next(i: List[String]) = i.map {"0" + _} ::: i.reverse.map {"1" + _}
next: (i: List[String])List[java.lang.String]
Run Code Online (Sandbox Code Playgroud)
如果我将返回类型指定为String
scala> def next(i: List[String]): List[String] = i.map {"0" + _} ::: i.reverse.map {"1" + _}
next: (i: List[String])List[String]
Run Code Online (Sandbox Code Playgroud)
为什么不同?我也可以将返回类型指定为List [Any],所以我猜String只是java.lang.String的包装器超类型.这有任何实际意义,还是我可以安全地不指定退货类型?
我理解零参数和无参数方法之间的区别,但我真正理解的是语言设计选择,这使得无参数方法成为必要.
我能想到的缺点:
() => X和=> X.x.toFoo(y)意思是什么,或者x.toFoo.apply(y)?(答:这要看是什么重载还有x的toFoo方法和重载Foo的apply方法,但如果有冲突,你不会看到一个错误,直到您尝试调用它.)().目前,您不能在类中定义两者:您会收到一条错误消息,说明该方法已定义.他们也都转换为Function0.
为什么不只是制作方法def foo和def foo()完全相同的东西,并允许使用括号或不使用括号来调用它们?它的优点是什么?
Scalatest中有什么东西允许我通过println声明测试输出到标准输出吗?
到目前为止,我一直在使用FunSuite with ShouldMatchers.
例如,我们如何检查打印输出
object Hi {
def hello() {
println("hello world")
}
}
Run Code Online (Sandbox Code Playgroud)