scala看看
更新日期:
Scala地看看,记点小Tips
until & to
1 2 3 4 5 6 7 8 | 1 scala> for (i <- 0 until 2) println("Hello") //<2 Hello Hello 2 scala> for (i <- 0 to 2) println("Hello") //<=2 Hello Hello Hello |
函数套函数
1 2 3 4 | 3 def add(more:Int) = (x:Int)=> x+more val int1 = add(1) // init more = 1 int1(10) // will call function x+1 = 11 |
_*
1 2 3 4 5 6 7 8 | 4 def echo(args :String*) = for(arg->args) println(arg) val arr = Array("what's", "up", "doc?") echo(arr:_*) what's up doc? |
Highrt Order function
1 2 3 4 5 6 7 8 9 10 11 | 5 高阶函数:higher-order-function 带其他函数做参数的函数 def filesMatching(query:String, matcher:(String, String)=> Boolean) ={ // matcher:(String, String)=> Boolean for(file <- filesHere; if matcher(file.getName, query)) yield file // matcher(file.getName, query) } def filesEnding(query:String) = filesMatching(query, _.endWith(_)) def filesContaining(query:String) = filesMatching(query, _.contains(_)) def filesRegex(query:String) = filesMatching(query, _.matches(_)) |
Curry
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 6 Curry化 柯里化声称“如果你固定某些参数,你将得到接受余下参数的一个函数”。所以对于有两个变量的函数y^x,如果固定了 y=2,则得到有一个变量的函数 2^x def first(x:Int) = (y:Int) => x+y first: (Int)(Int) => Int def twice(op: Int => Int, x:Int) = op(op(x)) //高阶函数 twice(_ + 1, 5) === op(x) = x + 1 | op(op(x)) === |
读书笔记
貸出模式 Loan Pattern 该模式大概说: 对于那些资源密集型(resource-intensive)对象应使用这一模式 既然是资源密集在一个对象中,那么用户代码就不能一直保持获得所有资源,而应该在需要时就向资源供给方进行借贷,使用完后应立即归还。
脆基类 派生类对基类有十分紧密的耦合,同时这个闭合的连接是不受欢迎的。设计师们因此给这种行为起了一个绰号——“脆基类问题”。基类是被认为十分脆弱的,因为你可以通过一个表面上十分安全的方法修改一个基类,但这个新的行为,当被派生类继承的时候,可能会造成派生类运行出错。你不能简单孤立地通过检查基类的方法来判断你对基类的改变是不是安全;你也必须查看(并测试)所有的派生类。此外,你必须检查所有+同时使用了基类和派生类对象的代码,因为这些代码可能会被新的行为所破坏。对关键的基类的小小的改变都会导致整个程序无法运行。&oq=派生类对基类有十分紧密的耦合,同时这个闭合的连接是不受欢迎的。设计师们因此给这种行为起了一个绰号——“脆基类问题”。基类是被认为十分脆弱的,因为你可以通过一个表面上十分安全的方法修改一个基类,但这个新的行为,当被派生类继承的时候,可能会造成派生类运行出错。你不能简单孤立地通过检查基类的方法来判断你对基类的改变是不是安全;你也必须查看(并测试)所有的派生类。此外,你必须检查所有+同时使用了基类和派生类对象的代码,因为这些代码可能会被新的行为所破坏。对关键的基类的小小的改变都会导致整个程序无法运行。
object看成是特殊的class,可以认为他是class的单例
1 2 3 4 5 6 7=== Any | class | Nothing/Null ===
Scala类层次结构
trait 有点抽象接口的意思