zoukankan      html  css  js  c++  java
  • coffescript

    GitHub上好多项目都是用coffee-script写的,尤其是运行于Nodejs下的项目,也没太在意,一直没有仔细看看coffee。我学习编程主要还是兴趣驱动,我之前对OT(google wave,etherpad等实时编辑器的核心)很感兴趣,这个项目ShareJs,用coffee实现了类似etherpad的功能,我要看代码,必须了解下coffee了

    1.coffee-script在线测试

    如果安装了Nodejs,直接在命令行下面跑最好了,这里提供了一个简单的线上测试环境

    http://jashkenas.github.com/coffee-script/ 单击TRY COFFEESCRIPT

    2.语法

    coffee最终是转化为js执行的,不去关注转化后的代码,那么如何写coffee-script呢?

    函数定义:

    hi = (a,b) ->
      alert(a+" say to:"+b+",hello!");
    

    右边会自动生成编译后真正执行的javascript(后面不再列出)

    var hi;
    hi = function(a, b) {
      return alert(a + " say to:" + b + ",hello!");
    };
    

    函数调用:不用括号

    hi "tom","Lily"
    

    字符

    内插字符:

    name = "tom"
    s = "hi #{name}"
    alert name
    
    /*跨越多行的字符,类似Python的语法*/
    name = "tom
    ,john
    ,kinas
    "
    s = "hi #{name}"
    alert name
    

    定义数组

    a = [1,2,3,4];/*第一种方法定义*/
    b = [ i for i in [1..10]];/*第二种方法,用 ‘..’ 表示范围*/
    alert a;
    alert b;
    

    遍历数组

    a = [1,2,3,4];
    b = [ i for i in a];/*很自然的遍历方式*/
    alert b;
    

    还可以调用函数:

    [alert i for i in a]
    
    

    this:在coffe没有显示的this,@代替之

    sayHello (name)->
      @name = name
      @say -> alert name
    
    

    对应的javascript:

    sayHello(function(name) {
      this.name = name;
      return this.say(function() {
        return alert(name);
      });
    });
    
    

    一行函数调用,带判断

    alert "I knew it!" if elvis?
    

    coffee-script 的继承(摘自这里)

    class Animal
        constructor: (@name) ->
    
        move: (meters) ->
            alert @name + " moved " + meters + "m."
    
    class Snake extends Animal
        move: ->
            alert "Slithering..."
            super 5

    观察生成的javascript,可以窥探其继承的实现

    for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
      function ctor() { this.constructor = child; }
      ctor.prototype = parent.prototype;
      child.prototype = new ctor;
      child.__super__ = parent.prototype;
      return child;
    };
    Animal = (function() {
      function Animal(name) {
        this.name = name;
      }
      Animal.prototype.move = function(meters) {
        return alert(this.name + " moved " + meters + "m.");
      };
      return Animal;
    })();
    Snake = (function() {
      __extends(Snake, Animal);
      function Snake() {
        Snake.__super__.constructor.apply(this, arguments);
      }
      Snake.prototype.move = function() {
        alert("Slithering...");
        return Snake.__super__.move.call(this, 5);
      };
      return Snake;
    })();
    
  • 相关阅读:
    中国石油大学天梯赛真题模拟第二场
    AtCoder Grand Contest 016 B
    POJ1011 Sticks
    UPC7817: Supermarket
    UPC5652: Ants on a Circle
    石大iCal课表使用指南
    UPC10582: Cowpatibility
    UPC11079: 小P的决斗 POJ3244 Difference between Triplets
    UPC6976:矩阵模板(二维哈希)
    知识点2-3:视图的职责
  • 原文地址:https://www.cnblogs.com/wewe/p/2067275.html
Copyright © 2011-2022 走看看