Easwy的Twitter微博(2010-05-30)

  • [Linux] rxvt可以把背景显示为桌面的背景(但不是透明效果)。命令:rxvt –inheritPixmap #
  • 张家界还是值得一看的,凤凰古城感觉有点开发过度了,可去可不去 #

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/easwy%e7%9a%84twitter%e5%be%ae%e5%8d%9a2010-05-30/

文章的脚注信息由WordPress的wp-posturl插件自动生成

Easwy的Twitter微博(2010-05-23)

  • 去张家界喽~~~ #
  • 自己动手,镜像博客 #
  • [scala] 用scala写了递归解决汉诺塔(Hanoi)游戏的程序,发现自己还是没完全掌握递归的精髓,看来一定要多多练习Thinking in recursive #
  • [scala] Scala 2.8.0 RC2已经发布! #
  • The little schemer看了一半,已经逐渐学会了递归思考…再看完后半部分,应该会对闭包(Closure)有更深入的理解了 #

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/easwy%e7%9a%84twitter%e5%be%ae%e5%8d%9a2010-05-23/

文章的脚注信息由WordPress的wp-posturl插件自动生成

Easwy的Twitter微博(2010-05-16)

  • [vim] 正在为scala写缩进文件,进展缓慢,因为scala的语法太灵活了,有很多种情况要考虑,最后不会搞的像php的缩进文件那么复杂吧? #
  • [vim] scala-tools里自带的scala缩进文件太难用了…明天参考一下其它的indent文件,把它改好用些 #
  • [c/c++] 在c/c++中,在头文件中include其它的头文件要慎重。不然的话,其它模块在引用你的头文件时,很容易因“file not found”而出现编译错误;要解决"file not found",需要增加很多的搜索路径,对编译速度也会有影响。 #

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/easwy%e7%9a%84twitter%e5%be%ae%e5%8d%9a2010-05-16/

文章的脚注信息由WordPress的wp-posturl插件自动生成

在scala中判断一个对象是否是元组(Tuple)

在scala user邮件列表中看到一个函数,判断一个对象是否是元组。从这个函数中,Easwy才了解到原来模式匹配(Pattern Match)也可以应用于正则表达式,这使得在scala中使用正则表达式(regex)更加容易了。另外,这个函数还展现了scala的另外两个特点:

  1. 尽量使用递归解决方案,而不是使用循环。这样做的优点之一是避免使用变量,优点之二是代码简洁。是否有其它优点,Easwy仍在总结。但Easwy始终有个担心,递归会不会导致效率降低?会不会有堆栈溢出风险?
  2. 使用Option类型做为函数返回值。使用Option类型的好处很明显,这样你的函数既可以返回执行失败的情况(None),也可以在执行成功时给出有用的返回值。这比使用tru/false作为返回值方便很多。

函数主体如下,为了方便讲解,在前面加了行号:

    
1 val Ptrn = """scala.Tuple(\d+)""".r
2
3 def checka( x: Class[ _ ]) : Option[ Int ] = x.getName match {
4      case Ptrn( i ) => Some( i.toInt )
5      case _ => { val sc = x.getSuperclass; if( sc != null ) checka( sc ) else None }
6 }
7
8 def isTuple( x: AnyRef ) = if( x.isInstanceOf[ Product ]) checka( x.getClass ) else None
     
  1. 行1定义了一个Pattern对象,可以看到,在scala中使用正则表达式非常的简单。
  2. 行3定义了一个递归函数checka(),它的参数是Class[_],返回值是Option[Int]类型。参数”Class[_]”的意思是这个函数可以接受任意Class[A]类型,也就是接受任何参数化的Class类型(Type Parameterization)。

  3. 从行3的后半句,到行5,是一个模式匹配,检查类的名字是否匹配正则表达式Ptrn。如果类名匹配Ptrn,也就是说是一个Tuple,则返回它的维数。例如,对Tuple3返回Some(3)。如果类名不匹配Ptrn,递归调用checka()检查其父类是否为Tuple,如果全部失败,则返回None。
  4. 行8定义isTuple()函数,调用checka()判断是否为Tuple。它首先会检查x是否是一个Product实例,满足时才调用checka(),否则直接返回None。

Easwy感觉checka()函数中的递归写的不是很好,在看过”The Little Schemer”后,Easwy更倾向与下面的写法:


    
  def checka(x: Class[_]): Option[Int] = x match {
    case null => None
    case _ => x.getName match {
      case Ptrn(i) => Some(i.toInt)
      case _ => checka(x.getSuperclass)
    }
  }
     

下面是Easwy用来测试该函数的程序,全文如下:


    
object TestTuple {
  def main(args: Array[String]) {
    class ttt(a: Any, b: Any, c: Any) extends Tuple3(a, b, c)

    val test = List(new Tuple2(1, 2), new ttt(1, 2, 3), "Hello World")

    for (elem <- test)
      isTuple(elem) match {
        case None => println("Not Tuple")
        case Some(x) => println("Is Tuple" + x)
      }
  }

  val Ptrn = """scala.Tuple(\d+)""".r

  def checka(x: Class[_]): Option[Int] = x match {
    case null => None
    case _ => x.getName match {
      case Ptrn(i) => Some(i.toInt)
      case _ => checka(x.getSuperclass)
    }
  }

  def isTuple( x: AnyRef ) = if( x.isInstanceOf[ Product ]) checka( x.getClass ) else None
}
    
  

有兴趣的朋友可以编译运行一下,体会一下scala的简捷与优雅。

更多内容,请阅读易水博客上的其它文章。

[ 参考文档 ]

  • [scala-user] Trying to discover if a object is a tuple

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/test_if_a_object_is_a_tuple_in_scala/

文章的脚注信息由WordPress的wp-posturl插件自动生成

Easwy的Twitter微博(2010-05-09)

  • 一个大到足以赐予你一切所求之物的政府,也强到足以剥夺你所拥有的一切。— 的确如此 #
  • [scala] 犯了一个和运算符优先级有关的错误。原来在scala中,左移位操作(<<)的优先级小于加号(+)。看来加括号是个好习惯。 #
  • [vim] 在vim中使用CTRL-]跳转时,如果文件已经更改了,则vim会提示文件未保存,有时候比较麻烦。有两种办法解决,一种是设置'autowrite'选项,自动保存;另一种是使能'hidden'选项。后一种有一定风险,因为在退出vim时很容易忘记还有文件未保存。 #
  • [bash] 还没搞懂在bash脚本中什么时候该用引号,什么时候不用。如果罢ABC为空字符串,[ -n $ABC ]会返回true,而[ -n "$ABC" ]则返回false。 #

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/easwy%e7%9a%84twitter%e5%be%ae%e5%8d%9a2010-05-09/

文章的脚注信息由WordPress的wp-posturl插件自动生成