
scala手记
axman
有寂寞陪着,我就不会寂寞。
展开
-
看完scala,发现java中finally允许返回结果真的是一种极其错误的设计。
try{ return x; }catch(Excpeiont e){ return y; } finally{ return z; }这样的代码无论如何都返回z,那么上面的任何return都显得没有意义。所以我们在绝大多数情况下都不会在finally中使用return语句,因为这使得这个方法几乎返回一个恒定的结果。但这并不能保证一个水平很差的程序员在finally中返回结果。我说原创 2012-08-21 09:36:04 · 3919 阅读 · 0 评论 -
今天想当然地被scala小坑了一下,Source的getLines回返的是Iterator我想当然地以为是list.
调试的时候第一次输出到屏幕,再输入到文件就没有内容了。原来返回的是Iterator而不是List, 第一次打印到屏幕时Iterator已经空了。原创 2013-12-20 11:40:10 · 3446 阅读 · 0 评论 -
SCALA的apply和update其实就是功能更强的“索引器”的作用。
比之C#而言,不仅仅可以访问int型定位的元素,也可以用来访问其它类型关联的元素,如map等。原创 2013-11-14 10:47:06 · 2361 阅读 · 0 评论 -
_*这个语法糖非常变态,完全没有实际的语义关联,完全是随心所欲,增加用户的记忆成本。
把数组的元素作为参数而不是把数据本身作为参数,使用这个语法糖完全没有理由,用户记得就是记得,记不得就完全不知道。没有任何推理和关联意义。原创 2013-11-25 15:47:16 · 1484 阅读 · 0 评论 -
即时函数的return是返回到调用这个函数的块外部,而不是返回到函数返回点。
如果我们直接在一个继承于App的类中定义:val f = (x: Int) => { return x; 2 }会提示我们:return outside method definition,现在我们把它放在一个方法中: def outter: Int = { val f = (x: Int) => { return x; 2 } println("before.") f(1)原创 2012-09-18 14:46:41 · 4409 阅读 · 0 评论 -
lazy value可以在需要的时候重新计算值,但不是重新赋值。
它可以起到var的部分作用,但又不可以被程序员手工重新赋值。int x = 0;lazy val value = 1/xtry{ println(value) }catch{ case _ => x = 1println(value)}可以在catch块中正确输出1,因为这时value重新计算为1/1.但是重新计算只能发生在异常时的异常处理中: var x = 1; lazy val val原创 2012-09-19 11:06:29 · 2542 阅读 · 0 评论 -
static Name & runtime value
class C { def sum(x: Int = 1, y: Int = 2): Int = { x + y }}class D extends C { override def sum(y: Int = 3, x: Int = 4): Int = { super.sum(x, y) }} val d: D = new D val c: C = dc.sum(x==0)原创 2012-09-13 14:16:24 · 2119 阅读 · 0 评论 -
线性化很可怕,结果原来是这样的,尽量少用
abstract class Root { def hello(s: String)}class SubA extends Root { def hello(s: String) { println("Hello,SubA! " + s) }}trait D extends Root { abstract override def hello(s: String) { supe原创 2012-08-27 17:39:43 · 2318 阅读 · 0 评论 -
trait中super调用动态绑定
class Root{ def hello(){ println("Hello,Root!") } } class SubA extends Root{ override def hello() { println("Hello,SubA!") } } trait D extends Root{ def traitHello(){ super.he原创 2012-08-27 15:54:54 · 2348 阅读 · 0 评论 -
Nothing是任何类型的子类这个定义非常好。
有Nullable的功能,却比Nullable更方便。其实没有什么实际意义,只是在编码时需要一个能代表任何类型的“东西”,却又是一个“表示无意义的特殊含义”。到少在返回值类型的异常值是不用返回-1,-99,-9999这样硬编码的特殊值来表示一个异常值。原创 2012-08-27 14:20:06 · 2137 阅读 · 0 评论 -
byName的高阶函数与普通参数的区别
本质的区别就是执行期不同,普通参数的表达式传参时已经开始执行,而byName的高阶函数在方式执行体中按定义顺序执行,有可能被短路。def paramterMethod(b:Boolean){ if(false && b) println("hello")}paramterMetho(5 > 3)在传参时5 > 3一定已经运行,如果改成 1/0==0肯定抛出错误。def funcMetho原创 2012-08-24 11:23:25 · 2927 阅读 · 0 评论 -
今天继续看scala的文档时,突然有一种奇怪的感觉,scala会死。
但愿这种感觉只是我的一种错觉,可是仍然有强烈的这程感觉 ,因为其中有太多的无厘头,有些完全就是设计者的标新立异,没有任何内存逻辑和理由,就是为了标新立异。原创 2013-12-18 11:52:35 · 1731 阅读 · 1 评论