zoukankan      html  css  js  c++  java
  • scala学习手记38

    方法命名约定

    之前在学习《运算符重载》一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级。现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例。

    比如下面这个例子:

    class Cow {
      def ^(moon: Moon) = println("Cow jumped over the moon")
    }
    
    class Moon {
      def ^:(cow: Cow) = println("This cow jumped over the moon too")
    }
    
    val cow = new Cow
    val moon = new Moon
    
    cow ^ moon
    cow ^: moon

    看一下执行结果:

    image

    除了以:结尾的运算符,还有一套运算符也是以其后的实例为目标的,包括一元运算符+、-、!和~。看下下面的例子:

    class Sample {
      def unary_+ = println("Called unary +")
    
      def unary_- = println("called unary -")
    
      def unary_! = println("called unary !")
    
      def unary_~ = println("called unary ~")
    }
    
    val sample = new Sample
    +sample
    -sample
    !sample
    ~sample

    一元运算符+会映射成对unary_+()的调用,还有一元运算符-会映射到unary_-()等。(Scala对方法名有规定,运算符不允许放在字母、数字这样的字符后面,除非这个运算符有下划线作为前缀。也就是说,方法不能叫jumpOver:(),而可以叫jumpOver_:())

    看下执行结果:

    image

    for表达式

    在容器中有内置的foreach方法,只要为foreach方法提供需要的函数值即可。如果要控制循环,或者要操作多个容器,就要使用外部迭代器。看个例子:

    for (i <- 1 to 3) {
      print("ho ")
    }

    上面这个表达式我们见过多次了,它会打印“ho ho ho”这样的字符串。实际上这个表达式是如下表达式的通用语法的简写形式:

    for([pattern <- generator; definition*]+; filter*) 
        [yield] expression

    for表达式接收的参数包括一个或多个生成器(generator),0或多个定义(definition),还有0或多个过滤器(filter)。这些东西彼此以分号分隔。yield关键字是可选的,如果它存在的话,就表示让表达式返回一组值而不是一个Unit。

    来看下yield的用法,下面是个例子:

    val result1 = for (i <- 1 to 3)
      yield i * 2
    
    val result2 = for (i <- 1 to 3)
      i * 2
    
    println(result1)
    println(result2)

    执行结果如下:

    image

    然后看一下filter,比如只对偶数执行函数值:

    val result1 = for (i <- 1 to 3; if i % 2 == 0)
      yield i * 2
    
    println(result1)

    看看执行结果:

    image

    再来看看变量定义:

    val result1 = for (i <- 1 to 3; j=i+1)
      yield j * 2
    
    println(result1)

    执行结果:

    image

    最后看一下多个生成器的使用:

    for (i <- 1 to 3; j <- 2 to 4)
      println(i + " , " + j)

    执行结果:

    image

    #########

  • 相关阅读:
    depression...
    Childhood is certainly not the happiest time of your time
    我在上海的日子(前言)
    struts国际化的一点尝试
    脚本(js)控制页面输入
    db2和oracle的一些区别
    工作几年是个坎?
    来深圳这半个月
    10年编程无师自通
    初试java mail
  • 原文地址:https://www.cnblogs.com/amunote/p/5875605.html
Copyright © 2011-2022 走看看