<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>lilu (李路)</title>
    <link>https://ruby-china.org/lilu</link>
    <description>Live in the future and build what seems interesting.</description>
    <language>en-us</language>
    <item>
      <title>出 Oculus Rift 一台，99 成新</title>
      <description>&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2013/8571ecdcd1f351189a37f375b2ccf08e.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;介绍见 &lt;a href="http://knewone.com/things/oculus-rift-xu-ni-xian-shi-tou-kui/reviews/51dcc53e7373c2628e0000d7" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;包装配件齐全，海关运单都有，佩戴总时间不超过 2 小时，价格 2100&lt;/p&gt;

&lt;p&gt;联系邮箱 lilu.life@gmail.com，qq 1735680798，我在深圳，可见面交易&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Wed, 18 Dec 2013 11:29:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/16271</link>
      <guid>https://ruby-china.org/topics/16271</guid>
    </item>
    <item>
      <title>[深圳] Knewone.com 招聘 Ruby/Javascript/iOS 程序员</title>
      <description>&lt;p&gt;原帖来自&lt;a href="http://knewone.com/things/knewone/reviews/5177e9a37373c28bfa000017" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://knewone.com" rel="nofollow" target="_blank" title=""&gt;knewone&lt;/a&gt;作为一个&lt;a href="http://knewone.com/about/startup.html" rel="nofollow" target="_blank" title=""&gt;lean startup&lt;/a&gt;的小团队，我们一直希望能保持小的规模，但是今天，我们不得不需要更多的新鲜血液来完成更多的事情。&lt;/p&gt;

&lt;p&gt;如果你是第一次知道 knewone，请先来&lt;a href="http://knewone.com" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;看一下，翻翻好玩的东西，如果你对这个网站及其上面的产品完全不感兴趣，下面就不用读了，请自行左上：）&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;knewone 是一个很酷的公司，所以希望你也是很酷的。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;喜欢买各种新奇的，稀奇古怪的东西，并乐此不疲地推荐给别人&lt;/li&gt;
&lt;li&gt;爱折腾，为了自己的爱好，生命不息，折腾不止&lt;/li&gt;
&lt;li&gt;喜欢与人交流，无论是现实中还是网络上&lt;/li&gt;
&lt;li&gt;喜欢交朋友，喜欢吃，喜欢到处逛&lt;/li&gt;
&lt;li&gt;用 Mac，当然 PC 装 Linux/BSD 也很好&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;对于后端技术人员来说，以下项目可以大大加分：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在 Github 上活跃&lt;/li&gt;
&lt;li&gt;玩 Arduino/Rasberry Pi 等开源硬件&lt;/li&gt;
&lt;li&gt;熟悉一种或几种非主流语言，比如：Lisp/Haskell/Scheme/Prolog/Erlang/Lua/Scala/Clojure&lt;/li&gt;
&lt;li&gt;精通 Javascript 和 CSS&lt;/li&gt;
&lt;li&gt;会编写 Shell 脚本&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;对于前端来说则是这些 (请注意，这里前后端真的没有写反)：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在 Github 上活跃&lt;/li&gt;
&lt;li&gt;玩 Arduino/Rasberry Pi 等开源硬件&lt;/li&gt;
&lt;li&gt;熟悉一种或几种主流后端动态语言，比如 Ruby/Python/Perl/Node.js&lt;/li&gt;
&lt;li&gt;懂得设计，熟悉字体和版式，会 PS，AI，Corel Draw，Final Cut 尤佳&lt;/li&gt;
&lt;li&gt;精通一种或几种客户端 MVC 库，如 Backbone/Angular/Ember/KnockoutJS/YUI/Batman&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;对于 ios 开发来说则是这样&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在 Github 上活跃&lt;/li&gt;
&lt;li&gt;玩 Arduino/Rasberry Pi 等开源硬件&lt;/li&gt;
&lt;li&gt;懂得设计，熟悉字体和版式&lt;/li&gt;
&lt;li&gt;精通 Http 及 Oauth 等 api 授权机制&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;我们能为你提供什么：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6k－20k，以及 options&lt;/li&gt;
&lt;li&gt;各种新鲜好玩儿的东西&lt;/li&gt;
&lt;li&gt;和各种有意思的人一起工作&lt;/li&gt;
&lt;li&gt;舒服的工作环境&lt;/li&gt;
&lt;li&gt;你可以骑车来上班，我们在华侨城，绿树成荫，公司提供淋浴&lt;/li&gt;
&lt;li&gt;阳台上会种一些菜，午餐由我们提供&lt;/li&gt;
&lt;li&gt;弹性工作时间，不用赶着点儿来上班&lt;/li&gt;
&lt;li&gt;女生每月可享受两天额外的休假&lt;/li&gt;
&lt;li&gt;如果你的工作需要长期坐在那里，可提供 Herman Miller Aeron 椅子 &lt;/li&gt;
&lt;li&gt;可以带宠物上班，这里有一只喜欢白富美的雪纳瑞 Cookie&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;联系方式：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;lilu@knewone.com&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;邮件内容请包含但不限于&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;你的个人经历或工作背景 (请勿发 word 格式）&lt;/li&gt;
&lt;li&gt;你的 Blog/Twitter/Github/微博/豆瓣等账号，方便我们进一步了解你&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;希望能有机会请你喝杯咖啡！&lt;/p&gt;

&lt;p&gt;&lt;img src="http://making-photos.b0.upaiyun.com/review_photos/ba6b2c1ee518000e940064968fe31de6.jpg!middle" title="" alt=""&gt;
&lt;img src="http://making-photos.b0.upaiyun.com/review_photos/feae0ad84e71a98fa7f6d574da35e0a4.jpg!middle" title="" alt=""&gt;
&lt;img src="http://making-photos.b0.upaiyun.com/review_photos/bba290cbfe5aeca2ccb0779519410632.jpg!middle" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Fri, 07 Jun 2013 14:31:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/11561</link>
      <guid>https://ruby-china.org/topics/11561</guid>
    </item>
    <item>
      <title>Herman Miller Aeron @ Knewone (广告)</title>
      <description>&lt;p&gt;此贴纯属广告，版主刀下留人。。。&lt;/p&gt;

&lt;p&gt;Knewone 又新订了 10 把 Aeron，椅子的具体介绍看&lt;a href="http://knewone.com/groups/5157982a7373c2bc6600000b/topics/516ff52b7373c28bde000041" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;型号都是 2B 和 3B，优先咱们 ruby china 的同学，有需要的人请回帖或联系我&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Sat, 04 May 2013 21:10:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/10709</link>
      <guid>https://ruby-china.org/topics/10709</guid>
    </item>
    <item>
      <title>OpenSSL Errors, Ruby 2.0 and Rails – Certificate Verify Failed </title>
      <description>&lt;p&gt;升级到 Ruby 2.0 之后，我在 Rails 开发中遇到了这个问题，不过，很快就在网上看到了问题的原因和解决方法，以下适用于 Mac OS X，相信 linux 下原理一致&lt;/p&gt;

&lt;p&gt;来自 &lt;a href="http://railsapps.github.com/openssl-certificate-verify-failed.html" rel="nofollow" target="_blank" title=""&gt;RailsAPP&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Are you getting an error “OpenSSL certificate verify failed” with Ruby?&lt;/p&gt;

&lt;p&gt;Or an error “Gem::RemoteFetcher::FetchError: SSL_connect returned=1 errno=0”?&lt;/p&gt;

&lt;p&gt;You may be seeing Ruby problems with OpenSSL because of conflicts with older versions of OpenSSL or outdated certificate files.&lt;/p&gt;

&lt;p&gt;Here are suggestions.&lt;/p&gt;
&lt;h2 id="Errors with Ruby 2.0"&gt;Errors with Ruby 2.0&lt;/h2&gt;&lt;h3 id="Check RubyGems Version"&gt;Check RubyGems Version&lt;/h3&gt;
&lt;p&gt;If you get OpenSSL errors with Ruby 2.0, make sure you are using RubyGems 2.0.3 or newer:&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gem &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use &lt;code&gt;gem update --system&lt;/code&gt; to upgrade the RubyGems system gem if necessary&lt;/p&gt;
&lt;h3 id="Old Versions of OpenSSL"&gt;Old Versions of OpenSSL&lt;/h3&gt;
&lt;p&gt;The version of OpenSSL that comes with Mac OS X 10.8 is too old for Ruby 2.0. You need to install a newer one with RVM or Homebrew.&lt;/p&gt;

&lt;p&gt;You should have OpenSSL 1.0.1e or newer installed in your environment:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you are using RVM, the newest version of RVM will install OpenSSL automatically. See the article Installing Rails. This may be the easiest solution.&lt;/p&gt;

&lt;p&gt;You can also install Homebrew and try this:&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;brew update
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;openssl
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;link &lt;/span&gt;openssl &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;curl-ca-bundle
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If OpenSSL is up to date, you may be having problems with outdated certificate files.&lt;/p&gt;

&lt;p&gt;James Tucker (raggi) has released a simple script (openssl-osx-ca) that uses Homebrew to update the OpenSSL security certificates found in the Mac OS X Keychain. The script replaces the outdated OpenSSL security certificates on your Mac with new certificates from Mozilla.org&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;brew tap raggi/ale
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;openssl-osx-ca
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>lilu</author>
      <pubDate>Thu, 28 Mar 2013 14:59:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/9813</link>
      <guid>https://ruby-china.org/topics/9813</guid>
    </item>
    <item>
      <title>Knewone: 从程序员视角看 Lean Startup (CSDN 线下活动&amp;讲义)</title>
      <description>&lt;p&gt;一月份的时候，和 &lt;a href="/xiaolai" class="user-mention" title="@xiaolai"&gt;&lt;i&gt;@&lt;/i&gt;xiaolai&lt;/a&gt; 一起用 lean startup 的方法做了&lt;a href="http://knewone.com" rel="nofollow" target="_blank" title=""&gt;knewone.com&lt;/a&gt; ，那最初的十几天不是一段很长的时间，但有着未曾经历过的密度和质量，所以借着这次 CSDN 办线下活动的机会，非常想把我们这次创业过程中的经验得失分享给各位&lt;/p&gt;

&lt;p&gt;时间：3 月 26 日的晚上 6 点&lt;/p&gt;

&lt;p&gt;地点：北京福泰酒店公寓一层纽约厅&lt;/p&gt;

&lt;p&gt;&lt;a href="http://huiyi.csdn.net/cmdn/view/235" rel="nofollow" target="_blank" title=""&gt;线上报名&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://knewone.com/about/startup.html" rel="nofollow" target="_blank" title=""&gt;讲义在这里&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;等着大家&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Wed, 20 Mar 2013 10:07:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/9585</link>
      <guid>https://ruby-china.org/topics/9585</guid>
    </item>
    <item>
      <title>Rails is omakase - 中文版</title>
      <description>&lt;p&gt;原作者是 DAVID HEINEMEIER HANSSON&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Omakase：お任せ，是源起日本頂級壽司餐館的點餐方式，無論是食材，菜品，還是用餐順序，完全由厨師來决定，價格往往非常高昂 &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;現在的世界哪哪都是那種"點菜"式的軟件，您要想吃頓飯，且得仔細看遍菜單，再琢磨出來今兒到底想吃嘛：來個我習慣的 ORM 開開胃，然後是我吃了好幾年的模板語言，最後來個路由庫當點心。於是，你得提前知道什麼合你的口，而且一旦你吃過覺得還不太壞，你會一直吃同样的東西，甚至於不知道這世界上還有別的什麼東西可吃。可悲的是，我們現在就是這麼消費軟件的。 &lt;/p&gt;

&lt;p&gt;但 Rails 不是這样的，Rails 是 omakase: 由厨師們挑選出材料，設計 api，然後为你排列使用順序--完全根據他們的主觀來决定，什麼才是一套美味的全棧框架。所以，给你呈上的大餐往往是個人色彩鮮明的，而且經常有點詭異離奇，保證不可能老少皆宜。 &lt;/p&gt;

&lt;p&gt;不過，也會有例外的時候，比如主顧們有時對有些東西過敏，所以我們也允許可接受範圍內的調整。你吃了 test/unit 會長疹子？沒關系，用 rspec 替代吧。你完全不能攝入咖啡因？(coffeescript)，好，從 Gemfile 裏幹掉那一行。 &lt;/p&gt;

&lt;p&gt;其實，我們的菜單還接受建議呢，親！不管是誰提出來的，好主意就是好主意。不過你要記得，友好的建議和來挑事的食客，還是有區別的。比如我有時候得做出這样的回复："嘿，抱歉我們這裏沒有熱狗，這玩意真的不适合放在我們的壽司菜單上，我知道你不懂鰻魚是啥，不過我們選擇它是有原因的，無論如何，感謝你的建議！"。如果爭論只是關於菜單的，那麼往往會到此为止。 &lt;/p&gt;

&lt;p&gt;可是這幫人還沒完了，他們繼續嚷嚷："可是我真的討厭鰻魚！它在糟蹋我的味蕾！趕緊拿走！！！！！"。Ok，坐下消停會兒 &lt;/p&gt;

&lt;p&gt;我們，好吧，我，作为 Rails 這頓 omakase 體驗的主厨，通常會根據我們千錘百煉的味覺和喜好來决定菜色。我可是在這兒幹了 10 個年頭了，耗在 Rails 上的時間估計得有上萬小時，這意味着我的品位應該不俗，當然，不一定适合你。 &lt;/p&gt;

&lt;p&gt;我們可以爭執什麼才算是"好吃"，不過一般的結論是"不愛吃就別吃"，特別是對於那些第一次吃壽司的顧客。你的經驗越少，你對我們越沒有幫助，你的論點越沒有份量，尤其是你的表達方式還如此粗魯無禮和讓人反感。 &lt;/p&gt;

&lt;p&gt;這貌似惹怒了一些人，他們會說："我的意見和你的一样有價值！"。錯，完全不對。你的意見，只對你有價值，對於我們为餐館設計的菜單來說嘛用沒有。喔，對，你還有用腳投票的權利，如果菜單上的東西讓你惡心，那你還在我們這兒瞎起什麼哄，那邊就有個門看見沒有？出去的時候別给我甩門就好。 &lt;/p&gt;

&lt;p&gt;如果你真的想對 Rails 的菜單設計做出點影響，哥們兒，你得努力的工作。我們這個禮拜剛剛往 Rails 核心組裏加了三個人，他們要麼接受命令打雜，要麼是"我剛試着做了個新菜式，請嘗嘗看好不好吃？"的謙虛學徒態度。從來沒有人，能夠僅僅在 Github 上寫幾條評論，發發 CoffeeScript 的牢騷，就能夠影響 Rails。 &lt;/p&gt;

&lt;p&gt;既然這種抱怨是如此的浪費人生和沒有意義，那为什麼有些人還沉迷於此呢？我得出的一個不成熟的結論是：這样會讓這些人看起來在社區中活躍。他們做不到日复一日的艱辛努力，就在有機會的時候跳出來試圖留下些亂糟糟的塗鴉證明自己的存在意義：耶！我盡力了！我表態了！我幹倒了...恩...Turbolinks? 等等，我們這個禮拜要搞的好像是 CoffeeScript？不對，是 Bundler? 草，管他的，反正幹倒什麼就對了！耶!!! &lt;/p&gt;

&lt;p&gt;今天說得夠多的了，我們還是得往前看。其實我也不是全都喜歡現在我們提供的菜品，另外還有些材料我實在不了解，所以說不出來我为什麼沒有選擇她們。這種時候，也許我會讓我的厨師們來做一些决定。的確，不可能每件事，每样東西都是我的喜好，但是，想讓全世界都知道鰻魚有多好吃，這背後真的沒有，也不需要什麼陰謀。 &lt;/p&gt;

&lt;p&gt;By David Heinemeier Hansson on Dec 27, 2012 &lt;/p&gt;

&lt;p&gt;Translated by lilu&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Sat, 05 Jan 2013 23:28:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/7791</link>
      <guid>https://ruby-china.org/topics/7791</guid>
    </item>
    <item>
      <title>Omniauth，微博与 CookieOverflow</title>
      <description>&lt;p&gt;在为&lt;a href="http://meejian.comdevise%E5%92%8Comniauth%E5%81%9A%E5%BE%AE%E5%8D%9A%E7%99%BB%E5%BD%95%E6%97%B6%EF%BC%8C%E7%8A%AF%E4%BA%86%E4%B8%80%E4%B8%AA%E9%94%99%E8%AF%AF%EF%BC%8C%E8%BF%99%E9%87%8C%E5%88%86%E4%BA%AB%E4%B8%80%E4%B8%8B%EF%BC%9A" rel="nofollow" target="_blank"&gt;http://meejian.comdevise和omniauth做微博登录时，犯了一个错误，这里分享一下：&lt;/a&gt;用&lt;/p&gt;

&lt;p&gt;有时候，你需要将 omniauth 返回的 env["omniauth.auth"] 的信息记录下来，然后在用户真正注册的时候把这些信息填充进去，这样用户就不用再填写一些头像姓名之类的信息了&lt;/p&gt;

&lt;p&gt;可以使用 session 记录，然后在 user model 里重载 devise 提供的&lt;code&gt;new_with_session&lt;/code&gt;方法：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;new_with_session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tap&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"devise.omniauth"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
          &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;merge_from_omniauth!&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;merge_from_omniauth!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;auths&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_omniauth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:info&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:info&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:location&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:info&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:description&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remote_avatar_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:info&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:image&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是，如果把&lt;code&gt;env["omniauth.auth"]&lt;/code&gt;的信息全部记录到&lt;code&gt;session["devise.omniauth"]&lt;/code&gt;中，只要是新浪微博做 provider，那么就会出现&lt;code&gt;ActionDispatch::Cookies::CookieOverflow&lt;/code&gt;的错误&lt;/p&gt;

&lt;p&gt;原因是微博返回的信息中有一个&lt;code&gt;:extra&lt;/code&gt;字段，它相当地大，所以造成了 cookie 的溢出 (因为 cookie 只能存有限的数据，通常浏览器是 4k）&lt;/p&gt;

&lt;p&gt;解决方法有两个：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 不用 cookie 存储 session 数据，改用数据库或别的内存存储方案&lt;/li&gt;
&lt;li&gt; &lt;code&gt;session["devise.omniauth"] = request.env["omniauth.auth"].except(:extra)&lt;/code&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;顺带一提，除了微博，twitter 的 oauth 返回数据也有这个很大的:extra 字段&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Fri, 14 Dec 2012 11:34:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/7559</link>
      <guid>https://ruby-china.org/topics/7559</guid>
    </item>
    <item>
      <title>关于电脑配置的访谈，求参与</title>
      <description>&lt;p&gt;&lt;a href="http://meejian.com/topics/ok-computer/interviews/50c980ebe84a446470000010" rel="nofollow" target="_blank"&gt;http://meejian.com/topics/ok-computer/interviews/50c980ebe84a446470000010&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这是在最近做的网站上发的我自己的硬件配置，也希望大家掺和掺和，写写自己心仪的好东西&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Thu, 13 Dec 2012 16:16:22 +0800</pubDate>
      <link>https://ruby-china.org/topics/7532</link>
      <guid>https://ruby-china.org/topics/7532</guid>
    </item>
    <item>
      <title>推荐 mongoid 下的 friendly_id: mongoid-slug</title>
      <description>&lt;p&gt;&lt;a href="https://github.com/digitalplaywright/mongoid-slug" rel="nofollow" target="_blank" title=""&gt;mongoid-slug&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;已升级为 1.0.0，简便好用&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Book&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Document&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Slug&lt;/span&gt;

  &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;
  &lt;span class="n"&gt;slug&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是 book resource 的 url 可以非常美好， "books/a-thousand-plateaus"&lt;/p&gt;

&lt;p&gt;更难能可贵的是对中文支持不错，比如&lt;code&gt;book.title="ruby指南"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;产生的 url，“books/rubyzhi-nan"&lt;/p&gt;

&lt;p&gt;这是基于字符串加强 gem &lt;a href="https://github.com/rsl/stringex" rel="nofollow" target="_blank" title=""&gt;stringex&lt;/a&gt; 的&lt;/p&gt;

&lt;p&gt;如果拼音重复了，会在后面自动加序数，比如“books/rubyzhi-nan-1"&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Mon, 08 Oct 2012 18:17:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/5921</link>
      <guid>https://ruby-china.org/topics/5921</guid>
    </item>
    <item>
      <title>[北京] Ruby 主题性活动建议</title>
      <description>&lt;p&gt;参加了几次北京社区的 ruby 活动，目前有两种活动形式&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;主题演讲&lt;/li&gt;
&lt;li&gt;自由交流讨论&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这两种各有利弊，前者缺少交流，每次都是大家在台上演讲，讲完就散，而后者又比较松散，难以沉淀下有价值的参考资料&lt;/p&gt;

&lt;p&gt;所以我建议之后每次 ruby 活动，除了演讲和交流之外，可以有且仅有一个主题，大家就此主题展开有组织的讨论，也比较容易留下对社区有价值的记录&lt;/p&gt;

&lt;p&gt;试举一些主题的例子：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;如何做测试，测试的粒度控制&lt;/li&gt;
&lt;li&gt;生产环境部署及服务器选用&lt;/li&gt;
&lt;li&gt;前端框架的比较及经验&lt;/li&gt;
&lt;li&gt;如何做后台管理&lt;/li&gt;
&lt;li&gt;如何做数据统计&lt;/li&gt;
&lt;li&gt;如何配置最适合的开发环境&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;肯定还有很多，希望各位提出自己愿意组织主持，或者参加讨论的主题&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Thu, 06 Sep 2012 11:35:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/5392</link>
      <guid>https://ruby-china.org/topics/5392</guid>
    </item>
    <item>
      <title>机械键盘 HKKB Pro 2 vs Others?</title>
      <description>&lt;p&gt;用了四年的 Cherry 茶轴 G80-3000 不幸出问题了，还是最要命的 Caps Lock&lt;/p&gt;

&lt;p&gt;现在只好去找个新键盘，大概扫了一眼，有如下选择&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HKKB PRO 2 &lt;/li&gt;
&lt;li&gt;Filco 圣手 2 忍者 青/红/茶轴&lt;/li&gt;
&lt;li&gt;Das Keyboard Model S Pro&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;有用过的人谈谈体会吗？我需要键盘在 Mac 和 Linux 下都能正常工作，大部分时间使用 Emacs&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Tue, 04 Sep 2012 13:42:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/5349</link>
      <guid>https://ruby-china.org/topics/5349</guid>
    </item>
    <item>
      <title>Kent Beck 谈测试粒度</title>
      <description>&lt;p&gt;不知道 kent beck 是谁的人请自行 wiki&lt;/p&gt;

&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/153234/how-deep-are-your-unit-tests" rel="nofollow" target="_blank"&gt;http://stackoverflow.com/questions/153234/how-deep-are-your-unit-tests&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;看第一个答案，我觉得关于是否应该追求代码覆盖率的争论该告一段落了&lt;/p&gt;

&lt;p&gt;我目前的推荐方案是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;复杂和容易出错的 model 方法做 unit test&lt;/li&gt;
&lt;li&gt;让 controller 尽可能 skinny，不做测试，除非是一些权限相关和有破坏性的&lt;/li&gt;
&lt;li&gt;客户端用 jasmine 做 unit test&lt;/li&gt;
&lt;li&gt;为你的产品最主要的故事流程做 integration test，用 capybara 或什么都成，但不应该超过三个&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>lilu</author>
      <pubDate>Tue, 04 Sep 2012 09:47:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/5343</link>
      <guid>https://ruby-china.org/topics/5343</guid>
    </item>
    <item>
      <title>Rails 学习推荐书籍列表</title>
      <description>&lt;p&gt;来自与我在&lt;a href="http://ruby-china.org/topics/5092" title=""&gt;北京 ruby 活动&lt;/a&gt;上组织新手学习讨论的一些结果，我想读书是最有效最全面和最扎实的吸取知识的方式，不过市场上滥竽充数的书籍实在很多，对于新手来说，怎样用有限的时间读最合适的书，是很重要的。&lt;/p&gt;

&lt;p&gt;所以，我基于自己读过的一些书和实践经验，总结了一下在目前进行 Ruby on Rails 学习的推荐读物，基本上纯粹是个人主观观点，欢迎各位高手抨击和补充&lt;/p&gt;
&lt;h3 id="Beginning"&gt;Beginning&lt;/h3&gt;
&lt;p&gt;起点阶段，强烈建议至少具备如下知识后再开始 Rails 开发&lt;/p&gt;
&lt;h4 id="Programming"&gt;Programming&lt;/h4&gt;
&lt;p&gt;首先需要了解一些如何做程序员的基本原则&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/1152111/" rel="nofollow" target="_blank" title=""&gt;The Pragmatic Programmer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这本书告诉你，如何做才能成为一个注重实效的程序员，涉及了非常，非常多的理念和实践，虽然都不深入，但至少让你知道世界是什么样子的。至今认为程序员最应该在新手阶段读的书，也是对整个业界影响最大的经典之一&lt;/p&gt;
&lt;h4 id="Linux"&gt;Linux&lt;/h4&gt;
&lt;p&gt;几乎所有的开发环境都严重依赖于 GNU/Linux 为主的命令行环境，因此需要学习 linux 的基本概念和操作&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/6806862/" rel="nofollow" target="_blank" title=""&gt;The Linux Command Line&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这本刚出的书是目前最好的 linux command line 学习指南，生动，清晰，详细，无论是菜鸟还是多年的老手都能从中受益，远超过之前作为标准教材的 practical guide to xx 系列。No starch 这个出版社既有延续至今的 Hacker 精神，也懂得如何发掘有趣的作者&lt;/p&gt;
&lt;h4 id="HTTP and Rest"&gt;HTTP and Rest&lt;/h4&gt;
&lt;p&gt;Web 开发对于 Http 的深入理解是必须的，另外 Rails 还使用 Rest 协议作为基本指导原则，所以需要深入理解 Http 和 Rest&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/3094230/" rel="nofollow" target="_blank" title=""&gt;RESTful Web Services&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这本是目前为止最好的描述 HTTP 与 Rest 的作品，可以让你重新认识 Web，更何况其中的示例是 Ruby 语言 (因为这本书合著者是 Sam Ruby)&lt;/p&gt;
&lt;h4 id="Html and CSS"&gt;Html and CSS&lt;/h4&gt;
&lt;p&gt;结构和样式不止是设计人员的事，web 开发必须要熟悉&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/1799652/" rel="nofollow" target="_blank" title=""&gt;Head First Html with CSS &amp;amp; XHTML&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;虽然已经出版了很久，但依然是最好的 Html&amp;amp;CSS 入门书&lt;/p&gt;
&lt;h4 id="Git and Version Control"&gt;Git and Version Control&lt;/h4&gt;
&lt;p&gt;版本控制在项目中是一开始就要使用的，不止是开发，一切事情都需要版本控制&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/3420144/" rel="nofollow" target="_blank" title=""&gt;Pro Git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这本是迄今为止讲解 Git 最清楚最深入的书，对于新手，不建议看后面的实现原理，先读前几章了解概念和学习日常实践使用是最重要的&lt;/p&gt;
&lt;h4 id="Ruby"&gt;Ruby&lt;/h4&gt;
&lt;p&gt;如果只是在 Rails 中使用的 Ruby，可以使用一些免费的快速入门教程，不过，系统地学习 Ruby，可以了解到很多面向对象开发或函数式编程的思想，对于熟悉和掌握 Rails 帮助非常大&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/3035267/" rel="nofollow" target="_blank" title=""&gt;Programming Ruby 1.9&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;公认的 Ruby 入门经典，不过对于新手来说，只推荐前半的入门部分，高阶内容可以稍后再来学习&lt;/p&gt;
&lt;h4 id="Rails"&gt;Rails&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://ruby.railstutorial.org/ruby-on-rails-tutorial-book" rel="nofollow" target="_blank" title=""&gt;Ruby on Rails Tutorial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;最后是 Rails 自身的学习，这本书的最新版涵盖 Rails3.2，是目前为止最好最完整的 Rails 入门教程，可以在线看，还有大量的视频搭配&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="Advanced"&gt;Advanced&lt;/h3&gt;
&lt;p&gt;进阶阶段，具备下面的知识，可以让你或多或少地理解 Rails Way，并真正开始写出合格的 Rails 应用&lt;/p&gt;
&lt;h4 id="Programming"&gt;Programming&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://book.douban.com/subject/4262627/" rel="nofollow" target="_blank" title=""&gt;Refactoring&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这本"重构"是当年石破天惊的经典著作，讲解如何持续改进和让代码优雅干净，拥有直到现在还依然适用的价值，尤其为 Ruby On Rails 社区广泛接受，这本书有将其中的 Java 语言换成 Ruby 后的&lt;a href="http://book.douban.com/subject/4821286/" rel="nofollow" target="_blank" title=""&gt;版本&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/1467587/" rel="nofollow" target="_blank" title=""&gt;The Art of Unix Programming&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;由公认的黑客领袖之一 Eric S.Raymond 撰写的这本书总结了长久以来的 Unix 领域中的设计和开发哲学，思想乃至文化体系，是了解 Ruby 和 Rails 诞生于其中的 Unix 黑客文化必不可少的读物&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/2243615/" rel="nofollow" target="_blank" title=""&gt;Head First Design Patterns&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;可以说是了解面向对象开发最容易学习也相对来说深入全面的书籍，无疑是深入浅出系列最出色的作品&lt;/p&gt;
&lt;h4 id="Ruby"&gt;Ruby&lt;/h4&gt;
&lt;p&gt;深入理解 Ruby，除了上边提到的 Programming Ruby 1.9 以及重构等通用编程书之外，还有以下几个选择&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/3329887/" rel="nofollow" target="_blank" title=""&gt;Ruby Programming Language&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ruby 之父松本行弘和 O'Reilly 的王牌作者合作，诞生了这本讲解 Ruby 最透彻的经典著作&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/6052175/" rel="nofollow" target="_blank" title=""&gt;Eloquent Ruby&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ruby 社区的编程指南之一，介绍了 Ruby 社群的文化，品味和编程原则，强烈地反映了 Ruby 程序员的共同特质：幽默，健谈，追求乐趣，热爱生活&lt;/p&gt;
&lt;h4 id="Test Drive"&gt;Test Drive&lt;/h4&gt;
&lt;p&gt;测试驱动开发 (TDD) 以及之后进化的行为驱动开发 (BDD) 是 Ruby 和 Rails 社群的核心文化之一，只有彻底理解并运用 BDD，才是合格的 Rails 开发者&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/3603693/" rel="nofollow" target="_blank" title=""&gt;RSpec Book&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;唯一的也是必读的 BDD 介绍作品，由 RSpec 核心成员撰写&lt;/p&gt;
&lt;h4 id="Git"&gt;Git&lt;/h4&gt;
&lt;p&gt;可以坚持把 Pro Git 的后半部分学习完，没有更深入和清楚的书了&lt;/p&gt;
&lt;h4 id="Html and CSS"&gt;Html and CSS&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://book.douban.com/subject/2152110/" rel="nofollow" target="_blank" title=""&gt;CSS, The Definitive Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eric Meyer 的 CSS 权威指南至今仍然是 CSS2 讲解最全面和最深入的参考书&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/6352828/" rel="nofollow" target="_blank" title=""&gt;The Book of CSS3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;目前最全面的 CSS3 特性介绍，秉承 No Starch 一贯的精品理念，写的也非常好&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/4143105/" rel="nofollow" target="_blank" title=""&gt;HTML5 Up and Running&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;著名 Googler Mark Pilgrim 的 HTML5 入门介绍作品，Rails3 中也有相当多的 HTML5 实践，这也将是之后的趋势&lt;/p&gt;
&lt;h4 id="Javascript and jQuery"&gt;Javascript and jQuery&lt;/h4&gt;
&lt;p&gt;Web 开发的交互性会越来越多，Javascript 已经成为了相当严肃，且热门程度超过 Ruby 的编程语言&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/10549733/" rel="nofollow" target="_blank" title=""&gt;Javascript, The Definitive Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;目前最全面最好的 Javascript 学习书籍&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/10569608/" rel="nofollow" target="_blank" title=""&gt;Learning jQuery&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;唯一尚可称得上紧跟 jQuery 发展脚步的学习指南&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/5252901/" rel="nofollow" target="_blank" title=""&gt;JavaScript Patterns&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;深入讲解 Javascript 的常见编程模式&lt;/p&gt;
&lt;h4 id="Rails"&gt;Rails&lt;/h4&gt;
&lt;p&gt;Rails 发展的实在太快了，最好的方法也许是跟踪在线文档，不过还是推荐这本&lt;/p&gt;

&lt;p&gt;&lt;a href="http://book.douban.com/subject/4739317/" rel="nofollow" target="_blank" title=""&gt;The Rails 3 Way&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;虽然有些内容随着 3.2 的推出已过时，但仍不失为了解 Rails 哲学和原则的入门之作&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="More"&gt;More&lt;/h3&gt;
&lt;p&gt;上边的书籍都读过的话，可能你终于能了解到 Rails 背后涉及的概念和实践有多么庞大惊人，也了解到了还有多么深的知识鸿沟需要跨越，了解到了一切都还只是开始，不过值得庆幸的是，一切事情都需要个开始&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Mon, 03 Sep 2012 13:17:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/5333</link>
      <guid>https://ruby-china.org/topics/5333</guid>
    </item>
    <item>
      <title>推荐 js 库列表</title>
      <description>&lt;p&gt;这里推荐的 js 库是完全主观的，我尽量在每一个领域里给出唯一的，也是我自己的选择&lt;/p&gt;

&lt;p&gt;应用环境是 web 客户端开发，暂时没有涉及 node 相关和移动 web 相关&lt;/p&gt;

&lt;p&gt;最新更新在&lt;a href="http://lilulife.com/recommends/" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Base"&gt;Base&lt;/h2&gt;&lt;h3 id="Preprocessor:  coffee-script"&gt;Preprocessor:  &lt;a href="https://github.com/jashkenas/coffee-script" rel="nofollow" target="_blank" title=""&gt;coffee-script&lt;/a&gt;
&lt;/h3&gt;&lt;h3 id="Client Framework:  jquery"&gt;Client Framework:  &lt;a href="https://github.com/jquery/jquery.git" rel="nofollow" target="_blank" title=""&gt;jquery&lt;/a&gt;
&lt;/h3&gt;&lt;h3 id="Function Lib:  underscore"&gt;Function Lib:  &lt;a href="https://github.com/documentcloud/underscore" rel="nofollow" target="_blank" title=""&gt;underscore&lt;/a&gt;
&lt;/h3&gt;&lt;h3 id="MV* Framework:  backbone"&gt;MV* Framework:  &lt;a href="https://github.com/documentcloud/backbone" rel="nofollow" target="_blank" title=""&gt;backbone&lt;/a&gt;
&lt;/h3&gt;&lt;h3 id="Test Framework: jasmine"&gt;Test Framework: &lt;a href="https://github.com/pivotal/jasmine" rel="nofollow" target="_blank" title=""&gt;jasmine&lt;/a&gt;
&lt;/h3&gt;&lt;h3 id="Template Engine:  handlebars"&gt;Template Engine:  &lt;a href="https://github.com/wycats/handlebars.js" rel="nofollow" target="_blank" title=""&gt;handlebars&lt;/a&gt;
&lt;/h3&gt;&lt;h3 id="Loader:  requirejs"&gt;Loader:  &lt;a href="https://github.com/jrburke/requirejs" rel="nofollow" target="_blank" title=""&gt;requirejs&lt;/a&gt;
&lt;/h3&gt;&lt;h3 id="Style Framework:   twitter-bootstrap"&gt;Style Framework:   &lt;a href="https://github.com/twitter/bootstrap" rel="nofollow" target="_blank" title=""&gt;twitter-bootstrap&lt;/a&gt;
&lt;/h3&gt;
&lt;hr&gt;
&lt;h2 id="Options"&gt;Options&lt;/h2&gt;&lt;h3 id="UI Widgets"&gt;UI Widgets&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jquery/jquery-ui" rel="nofollow" target="_blank" title=""&gt;jquery-ui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;jquery ui 组件库&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/blueimp/jQuery-File-Upload" rel="nofollow" target="_blank" title=""&gt;jquery-file-upload&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;file upload 组件&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/ivaynberg/select2" rel="nofollow" target="_blank" title=""&gt;select2&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;select box 组件&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/jackmoore/colorbox" rel="nofollow" target="_blank" title=""&gt;colorbox&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;lightbox 组件&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/needim/noty" rel="nofollow" target="_blank" title=""&gt;noty&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;notification 组件&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/xing/wysihtml5" rel="nofollow" target="_blank" title=""&gt;wysihtml5&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rich Text Editor&lt;/p&gt;
&lt;h3 id="UI Components"&gt;UI Components&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/FortAwesome/Font-Awesome" rel="nofollow" target="_blank" title=""&gt;font-awesome&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;为 bootstrap 补充大量的 icon 和相关行为&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/fgnass/spin.js" rel="nofollow" target="_blank" title=""&gt;spin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;可定制的 loading 指示器 spin，无需图像&lt;/p&gt;
&lt;h3 id="UI Layouts"&gt;UI Layouts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/desandro/isotope" rel="nofollow" target="_blank" title=""&gt;isotype&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;实现各种独特的元素布局方式，也可以自定制&lt;/p&gt;
&lt;h3 id="HTML5 Polyfills"&gt;HTML5 Polyfills&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Modernizr/Modernizr" rel="nofollow" target="_blank" title=""&gt;modernizr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;帮助探测识别当前环境对 CSS3 和 HTML5 元素的支持&lt;/p&gt;

&lt;p&gt;其他 polyfills 有很好的&lt;a href="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills" rel="nofollow" target="_blank" title=""&gt;列表&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="Formats"&gt;Formats&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jzaefferer/jquery-validation" rel="nofollow" target="_blank" title=""&gt;jquery-validation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;jquery 的 form 校验库&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/timrwood/moment" rel="nofollow" target="_blank" title=""&gt;moment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;解析和显示各类时间格式&lt;/p&gt;
&lt;h3 id="Misc"&gt;Misc&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/defunkt/jquery-pjax" rel="nofollow" target="_blank" title=""&gt;jquery-pjax&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;利用 pushstate 做到无刷新的页面跳转&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/madrobby/keymaster" rel="nofollow" target="_blank" title=""&gt;keymaster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;方便地定义快捷键&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Wed, 29 Aug 2012 17:47:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/5237</link>
      <guid>https://ruby-china.org/topics/5237</guid>
    </item>
    <item>
      <title>我使用的 Rails Gems 列表</title>
      <description>&lt;p&gt;比较主观的一个列表，就不添加到社区的 gems wiki 里了&lt;/p&gt;

&lt;p&gt;最新更新在&lt;a href="http://lilulife.com/recommends/" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="Rails Test Drive"&gt;Rails Test Drive&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/rspec/rspec-rails" rel="nofollow" target="_blank" title=""&gt;rspec-rails&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;行为测试框架 rspec 的 rails 集成&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bradphelan/jasminerice" rel="nofollow" target="_blank" title=""&gt;jasminerice&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;javascript 测试框架 jasmine 的 rails 集成&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/jnicklas/capybara" rel="nofollow" target="_blank" title=""&gt;capybara&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;web 行为模拟框架&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/paulelliott/fabrication" rel="nofollow" target="_blank" title=""&gt;fabrication&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;测试夹具生成&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/EmmanuelOga/ffaker" rel="nofollow" target="_blank" title=""&gt;ffaker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最快的假数据生成器&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bmabey/database_cleaner" rel="nofollow" target="_blank" title=""&gt;database_cleaner&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;测试数据库清空工具&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/guard/guard" rel="nofollow" target="_blank" title=""&gt;guard&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;监控文件变化的事件并触发任务，有大量扩展，非常适合运行 spec&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/guard/guard-rspec" rel="nofollow" target="_blank" title=""&gt;guard-rspec&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;rspec 的 guard 插件&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/guard/guard-spork" rel="nofollow" target="_blank" title=""&gt;guard-spork&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;让 guard 集成 DRb server：spork，预加载测试环境可以节省大量的测试时间&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/netzpirat/guard-jasmine" rel="nofollow" target="_blank" title=""&gt;guard-jasmine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;jasmine 的 guard 插件，使用 phantomjs 做无头浏览器测试&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/guard/guard-livereload" rel="nofollow" target="_blank" title=""&gt;guard-livereload&lt;/a&gt;&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;livereload 的 guard 插件，自动刷新浏览器&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="Rails Auth"&gt;Rails Auth&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/plataformatec/devise" rel="nofollow" target="_blank" title=""&gt;devise&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;用户注册登录，身份验证的整套解决方案&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/intridea/omniauth" rel="nofollow" target="_blank" title=""&gt;omniauth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;实现第三方登录认证，包括 Twitter，Facebook，微博等等&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ryanb/cancan" rel="nofollow" target="_blank" title=""&gt;cancan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;为不同用户设定不同级别的权限&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="Rails Frontend"&gt;Rails Frontend&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rails/coffee-rails" rel="nofollow" target="_blank" title=""&gt;coffee-rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rails 默认使用 coffeescript 生成 javascript&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rails/jquery-rails" rel="nofollow" target="_blank" title=""&gt;jquery-rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rails 默认的 javascript 框架 jQuery&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/meleyal/backbone-on-rails" rel="nofollow" target="_blank" title=""&gt;backbone-on-rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最热门的 Javascript MV*框架 backbone&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rails/sass-rails" rel="nofollow" target="_blank" title=""&gt;sass-rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rails 默认使用 sass 代替 css&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/chriseppstein/compass" rel="nofollow" target="_blank" title=""&gt;compass-rails&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最强大的 CSS 编程框架 Compass，基于 sass&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/thomas-mcdonald/bootstrap-sass" rel="nofollow" target="_blank" title=""&gt;bootstrap-sass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CSS 样式库 Twitter Bootstrap 的 sass 移植&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://slim-lang.com" rel="nofollow" target="_blank" title=""&gt;slim&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;比 Haml 更清晰和更快的模板引擎&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/amatsuda/kaminari" rel="nofollow" target="_blank" title=""&gt;kaminari&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最好的分页控制器&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/plataformatec/simple_form" rel="nofollow" target="_blank" title=""&gt;simpleForm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;比起 Rails 默认的 Form 更简洁和更强大的表单控制器&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bcardarella/client_side_validations" rel="nofollow" target="_blank" title=""&gt;client_side_validations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;读取服务端 Model 的验证逻辑并生成对应的客户端验证逻辑，做到 DRY&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="Rails Backend"&gt;Rails Backend&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mongoid/mongoid" rel="nofollow" target="_blank" title=""&gt;mongoid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mongo ORM&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nokogiri.org/" rel="nofollow" target="_blank" title=""&gt;nokogiri&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML 解析器&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/capistrano/capistrano" rel="nofollow" target="_blank" title=""&gt;capistrano&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;远程部署工具&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jnicklas/carrierwave" rel="nofollow" target="_blank" title=""&gt;carrierwave&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;文件上传管理，支持各类 ORM，还可以支持各云平台的存储&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/sunspot/sunspot" rel="nofollow" target="_blank" title=""&gt;sunspot&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;基于 SOLR 的全文检索引擎&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/defunkt/resque" rel="nofollow" target="_blank" title=""&gt;resque&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;将任务放入后台队列执行&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/javan/whenever" rel="nofollow" target="_blank" title=""&gt;whenever&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;编写和部署 Cron&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/intridea/grape" rel="nofollow" target="_blank" title=""&gt;grape&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;创建 REST API&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="Rails Misc"&gt;Rails Misc&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/railsbp/rails_best_practices" rel="nofollow" target="_blank" title=""&gt;rails_best_practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;控制代码质量的优秀工具&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/gregbell/active_admin" rel="nofollow" target="_blank" title=""&gt;active_admin&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;为 Rails 项目创建后台管理界面，非常强大的可定制 UI&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="Ruby General"&gt;Ruby General&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://pry.github.com/" rel="nofollow" target="_blank" title=""&gt;pry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;比起默认的 IRB shell 更强大的终端调试工具&lt;/p&gt;

&lt;hr&gt;</description>
      <author>lilu</author>
      <pubDate>Tue, 28 Aug 2012 14:35:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/5205</link>
      <guid>https://ruby-china.org/topics/5205</guid>
    </item>
    <item>
      <title>Journey Through The JavaScript MVC Jungle</title>
      <description>&lt;p&gt;著名的前端开发大师 Addy Osmani 最近出炉的各种 Javascript MV*框架的比较和结论，分享一下&lt;/p&gt;

&lt;p&gt;&lt;a href="http://coding.smashingmagazine.com/2012/07/27/journey-through-the-javascript-mvc-jungle/" rel="nofollow" target="_blank"&gt;http://coding.smashingmagazine.com/2012/07/27/journey-through-the-javascript-mvc-jungle/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;我的感想是 Backbone.js 和 Ember.js 还是最值得考虑的两个选项，前者更简洁灵活，后者更复杂强大，前者有很多留白，不得不用自己的方式实现很多功能，后者则是约定大于配置，几乎什么方面都有默认的实现，两者的关系非常像 sinatra 和 rails&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Tue, 14 Aug 2012 14:22:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/4930</link>
      <guid>https://ruby-china.org/topics/4930</guid>
    </item>
    <item>
      <title>CoffeeScript 详解</title>
      <description>&lt;p&gt;这是今年年初学习 CoffeeScript 的一篇个人总结，觉得也许会对社区有些帮助，就从&lt;a href="http://lilulife.com/blog/2012/08/06/coffeescript/" rel="nofollow" target="_blank" title=""&gt;我的博客&lt;/a&gt;转来了这里，因为水平有限，错漏之处在所难免，希望高手指点&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="序"&gt;序&lt;/h2&gt;
&lt;hr&gt;

&lt;blockquote&gt;
&lt;p&gt;Every language feature in CoffeeScript has been designed using this kind of process:
  attempt to take the beautiful dynamic semantics of JavaScript—object literals, function expressions, prototypal inheritance—and express them in a clean, readable, minimal way.
by Jeremy Ashkenas, author of CoffeeScript&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://coffeescript.org/" rel="nofollow" target="_blank" title=""&gt;CoffeeScript&lt;/a&gt;是一门简洁的，构架于 JavaScript 之上的预处理器语言，可以静态编译成 JavaScript，语法主要受 ruby 和 python 影响，目前已经为众多 rails 和 node 项目采用。&lt;/p&gt;

&lt;p&gt;为什么要用 CoffeeScript?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;更少，更紧凑，和更清晰的代码&lt;/li&gt;
&lt;li&gt;通过规避和改变对 JavaScript 中不良部分的使用，只留下精华，让代码减少出错率，更容易维护&lt;/li&gt;
&lt;li&gt;在很多常用模式的实现上采用了 JavaScript 中的最佳实践&lt;/li&gt;
&lt;li&gt;CoffeeScript 生成的 JavaScript 代码都可以完全通过&lt;a href="http://www.javascriptlint.com/" rel="nofollow" target="_blank" title=""&gt;JSLint&lt;/a&gt;的检测&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;什么情况下不推荐使用 CoffeeScript?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CoffeeScript 不是 JavaScript 的超集，也不是完全替代品，不应该在不会 JavaScript 的情况下使用 CoffeeScript 工作&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CoffeeScript 是一种需要预编译的语言，不能在运行时 (Runtime) 解释，这造成了她普遍被人质疑的一点，就是如果代码中出现运行时错误时难以调试，不过从实际使用上来看，因为 CoffeeScript 的编译结果大部分情况下自然而合理，至少我从来没有发现从生成的 JavaScript 代码回溯到对应的 CoffeeScript 代码有什么困难之处，我们稍后会看到这种对应关系的细节&lt;/p&gt;

&lt;p&gt;这种静态编译还有一个额外的好处，就是 CoffeeScript 和现有的环境 (浏览器，Node,Rhino 等) 与库完全兼容&lt;/p&gt;

&lt;p&gt;最简单的安装和测试 CoffeeScript 的方法，是使用&lt;em&gt;node.js&lt;/em&gt;的&lt;em&gt;npm&lt;/em&gt;安装，然后使用命令行脚本实时编译&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; coffee-script
&lt;span class="c"&gt;# watch and compile&lt;/span&gt;
coffee &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; lib &lt;span class="nt"&gt;--compile&lt;/span&gt; src
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里假设你的 coffee 代码在 src 目录下，这个 daemon 会自动检测文件的改变，并编译成 js 文件放到 lib 目录下&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="语法"&gt;语法&lt;/h2&gt;
&lt;p&gt;与 SASS/LESS 和 CSS 的关系不同，CoffeeScript 不是 JavaScript 的超集，不能在 CoffeeScript 程序中写 JavaScript 代码，比如&lt;code&gt;function&lt;/code&gt;等关键字&lt;/p&gt;
&lt;h3 id="格式"&gt;格式&lt;/h3&gt;
&lt;p&gt;在 js 中，如果认为当前语句和随后语句是一个整体的话，就不会自己加&lt;code&gt;;&lt;/code&gt;，比如以下 javascript 代码&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//javascript code&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;//parsed to:&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;很多 js 中的问题由此引起 (实际上现在把&lt;code&gt;;&lt;/code&gt;放在哪里，在 js 社区内也是个争论的话题)&lt;/p&gt;

&lt;p&gt;而 CoffeeScript 在编译时为每条语句加上&lt;code&gt;;&lt;/code&gt;，因此在代码中&lt;strong&gt;不需要&lt;/strong&gt;写&lt;code&gt;;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;CoffeeScript 中的注释采用&lt;code&gt;#&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;# single line comment&lt;/span&gt;
&lt;span class="cm"&gt;### 
  multi line comment
###&lt;/span&gt;    
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CoffeeScript 中对空白敏感，这种做法来自 python，任何需要&lt;code&gt;({})&lt;/code&gt;的场合下，可以用缩进代替&lt;/p&gt;
&lt;h3 id="作用域"&gt;作用域&lt;/h3&gt;
&lt;p&gt;在 js 中最糟糕的设计就是全局变量，当你忘记用&lt;code&gt;var&lt;/code&gt;声明变量的时候，这个变量会成为全局对象上的一个属性&lt;/p&gt;

&lt;p&gt;CoffeeScript 避免了这点&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"bar"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会编译成&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;任何的代码都会使用&lt;em&gt;Immediate Function&lt;/em&gt;包装，这样&lt;code&gt;foo&lt;/code&gt;成为了本地变量，并且，可以通过&lt;code&gt;call&lt;/code&gt;指定的&lt;code&gt;this&lt;/code&gt;引用全局对象&lt;/p&gt;

&lt;p&gt;为了方便起见，之后的编译后代码描述不会再加上这个包装&lt;/p&gt;

&lt;p&gt;实际上在 CoffeeScript 中，你也不需要再用&lt;code&gt;var&lt;/code&gt;声明变量，编译后会自动加上&lt;code&gt;var&lt;/code&gt;，并且将声明&lt;em&gt;hoisting&lt;/em&gt;，即放到作用域的顶部，看一个来自官方文档的例子&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;outer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nx"&gt;change&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;inner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nx"&gt;outer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="nx"&gt;inner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;change&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt;是函数定义的简写方式，之后我们会探讨&lt;/p&gt;

&lt;p&gt;编译后的 js 如下：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;change&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;outer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;change&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;inner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;outer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;inner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;change&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是类似 ruby 中的自然的作用域实现方式，&lt;code&gt;inner&lt;/code&gt;在&lt;code&gt;change()&lt;/code&gt;内定义成了局部变量，因为在代码中之前没有定义过&lt;/p&gt;
&lt;h3 id="赋值"&gt;赋值&lt;/h3&gt;
&lt;p&gt;首先是字符串可以用类 ruby 的语法内嵌&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"world"&lt;/span&gt;
&lt;span class="nx"&gt;alert&lt;/span&gt; &lt;span class="s"&gt;"hello, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其次是字面量，可以用类似&lt;em&gt;YAML&lt;/em&gt;的方法定义对象字面量&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;object1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="na"&gt;one&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;two&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="nx"&gt;object2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="na"&gt;one&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;two&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"numbers"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意保留字&lt;code&gt;class&lt;/code&gt;，现在可以直接作为对象的 key 了&lt;/p&gt;

&lt;p&gt;数组也可以分行&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以解构赋值 (Destructuring)&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"foo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;"bar"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;
&lt;span class="nx"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="数组"&gt;数组&lt;/h3&gt;
&lt;p&gt;数组的操作引入了来自 ruby 的 Range 概念，并且可以将字符串完全作为数组操作&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nx"&gt;my&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"my string"&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;判断一个值是否在数组内，在 js 中可以用&lt;code&gt;Array.prototype.indexOf&lt;/code&gt;，不过 IE8 及以下不支持，CoffeeScript 提供了跨浏览器的&lt;code&gt;in&lt;/code&gt;操作符解决&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"foo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"bar"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="s"&gt;"foo"&lt;/span&gt; &lt;span class="o"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具体的实现上，是一个对&lt;code&gt;indexOf&lt;/code&gt;的 Shim&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="nx"&gt;__indexOf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[].&lt;/span&gt;&lt;span class="nx"&gt;indexOf&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
     &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
       &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
     &lt;span class="p"&gt;}&lt;/span&gt; 
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
   &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;__indexOf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;for..in&lt;/code&gt;语法可以用在数组上了，背后是用 js 的 for 循环实现的，这比数组的迭代器方法要效率高一些&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Roger"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Roderick"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;alert&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - Release &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也具有过滤器&lt;code&gt;when&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;prisoners&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Roger"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Roderick"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Brian"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nx"&gt;release&lt;/span&gt; &lt;span class="nx"&gt;prisoner&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;prisoner&lt;/span&gt; &lt;span class="o"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;prisoners&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="nx"&gt;prisoner&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;is&lt;/span&gt; &lt;span class="s"&gt;"R"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看起来很像普通英语了，也可以用&lt;code&gt;()&lt;/code&gt;收集遍历的结果&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;is&lt;/span&gt; &lt;span class="s"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;遍历对象的属性可以用&lt;code&gt;of&lt;/code&gt;,这是用 js 自己的&lt;code&gt;for..in&lt;/code&gt;实现的&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="na"&gt;sam&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;seaborn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;donna&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;moss&lt;/span&gt;
&lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nx"&gt;last&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;last&lt;/span&gt; &lt;span class="o"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="流程控制"&gt;流程控制&lt;/h3&gt;
&lt;p&gt;CoffeeScript 使用来自 ruby 的省略语法，让控制流变得很紧凑，也引进了&lt;code&gt;unless&lt;/code&gt;,&lt;code&gt;not&lt;/code&gt;,&lt;code&gt;then&lt;/code&gt;等语法糖式的关键字&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;not&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="s"&gt;"false"&lt;/span&gt;
&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;unless&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="s"&gt;"false"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CoffeeScript 中非常好的一点，就是直接取消了 js 中的&lt;code&gt;==&lt;/code&gt;判断，改成全部用&lt;code&gt;===&lt;/code&gt;进行严格比较，js 中的&lt;code&gt;==&lt;/code&gt;会做大量诡异的类型转换，很多情况下是 bug 的来源&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; 
  &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"equal"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
  &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"not equal"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在使用&lt;code&gt;if&lt;/code&gt;来进行空值的判断时，js 有时会让人困扰，因为""和 0 都会被转换成 false，Coffee 提供了&lt;code&gt;?&lt;/code&gt;操作符解决这个问题，她只有在变量为&lt;code&gt;null&lt;/code&gt;或&lt;code&gt;undefined&lt;/code&gt;时才为 false&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="c1"&gt;#true&lt;/span&gt;
&lt;span class="no"&gt;null&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="c1"&gt;#false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以用常见的类似 ruby 中&lt;code&gt;||=&lt;/code&gt;的方法，判断赋值，此外还可以用&lt;code&gt;and&lt;/code&gt;,&lt;code&gt;or&lt;/code&gt;,&lt;code&gt;is&lt;/code&gt;关键字代替&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;,&lt;code&gt;||&lt;/code&gt;,&lt;code&gt;==&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;or=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;?=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;经常有当某个属性存在的时候，才会调用属性上的方法的情况，这时候也可以用&lt;code&gt;?&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;knight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasSword&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;poke&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只有当&lt;code&gt;hasSword()&lt;/code&gt;返回对象不为空时，才会调用&lt;code&gt;poke&lt;/code&gt;方法，以下是编译的 js 代码&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_ref&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;_ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;knight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasSword&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;_ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;poke&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另一种情况是当&lt;code&gt;poke&lt;/code&gt;方法存在时才调用&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;knight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasSword&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;poke&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对应的 js 代码&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;knight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasSword&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nx"&gt;poke&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;_base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;poke&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;switch case&lt;/code&gt;语句也有了一些语法糖，并且会默认加上&lt;code&gt;break&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="nx"&gt;day&lt;/span&gt;
  &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s"&gt;"Sun"&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nx"&gt;go&lt;/span&gt; &lt;span class="nx"&gt;relax&lt;/span&gt;
  &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s"&gt;"Sat"&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nx"&gt;go&lt;/span&gt; &lt;span class="nx"&gt;dancing&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nx"&gt;go&lt;/span&gt; &lt;span class="nx"&gt;work&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="函数"&gt;函数&lt;/h3&gt;
&lt;p&gt;CoffeeScript 对 JavaScript 的函数做了很大的简化，举个例子，看一个求和函数&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;...)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reduce&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;

&lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对应 JavaScript&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;__slice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[].&lt;/span&gt;&lt;span class="nx"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;nums&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;__slice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以使用和 ruby 1.9 类似的&lt;em&gt;lambda 函数&lt;/em&gt;写法&lt;code&gt;-&amp;gt;&lt;/code&gt;来代替&lt;code&gt;function&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;参数列表放在&lt;code&gt;-&amp;gt;&lt;/code&gt;的前边，且可省略&lt;/li&gt;
&lt;li&gt;取消了函数声明，只能将函数作为值定义&lt;/li&gt;
&lt;li&gt;在 CoffeeScript 中，&lt;strong&gt;任何&lt;/strong&gt;语句都是表达式 (除了&lt;code&gt;break&lt;/code&gt;和&lt;code&gt;continue&lt;/code&gt;)，都有返回值，因此像 ruby 一样，不需要显式&lt;code&gt;return&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;js 的函数参数有一个很讨厌的地方，就是参数对象&lt;code&gt;arguments&lt;/code&gt;不是一个真正的数组，要使用数组方法，必须转换成数组&lt;code&gt;[].slice.call(arguments, 0)&lt;/code&gt;这样，而在 CoffeeScript 中收束 (加&lt;code&gt;...&lt;/code&gt;) 的参数是一个真正的数组&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CoffeeScript 的函数可以有默认参数，如&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;times&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CoffeeScript 的函数调用可以不用&lt;code&gt;()&lt;/code&gt;语法包围参数，像 ruby 一样跟在函数名后面就可以，不过这也有时候会带来问题，特别是没有参数的调用&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;alert&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对应的 js&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而不是&lt;code&gt;alert()&lt;/code&gt;，这和 ruby 不同，需要注意&lt;/p&gt;

&lt;p&gt;缩进的格式有时需要小心，比如用多个函数做参数的时候，需要这样写&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".toggle"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toggle&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;"on"&lt;/span&gt;
&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;"off"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对应 js&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.toggle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;on&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id="模式"&gt;模式&lt;/h2&gt;
&lt;p&gt;使用 CoffeeScript 的一个重要理由，就是她用自己的语法实现了很多很常用的 js 编程模式，而且，通常是在社区内广泛被承认的最佳实践，如果不熟悉 JavaScript 的这些模式，可能会在调试代码上遇到一些麻烦，不过，基本上来说还是比较简单易懂的，下面我们会花一些时间研究一下 CoffeeScript 是用什么样的方法来封装这些通用编程模式的&lt;/p&gt;
&lt;h3 id="闭包"&gt;闭包&lt;/h3&gt;
&lt;p&gt;在 js 中，普遍会使用闭包实现各种事件的 handler 或封装模块，以下是 CoffeeScript 对这一普遍模式的实现&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;closure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;_private&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"foo"&lt;/span&gt;
  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;_private&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;closure&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; "foo"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;do&lt;/code&gt;关键词可以产生一个&lt;em&gt;Immediate Function&lt;/em&gt;,下面是对应 js 代码&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;closure&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;closure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_private&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;_private&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;_private&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;闭包中经常需要绑定&lt;code&gt;this&lt;/code&gt;的值给闭包的私有变量，CoffeeScript 使用特殊的&lt;code&gt;=&amp;gt;&lt;/code&gt;语法省去了这个麻烦&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;clickHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;alert&lt;/span&gt; &lt;span class="s"&gt;"clicked"&lt;/span&gt;
&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addEventListener&lt;/span&gt; &lt;span class="s"&gt;"click"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;clickHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用&lt;code&gt;=&amp;gt;&lt;/code&gt;生成函数，可以看到生成代码中会加上对&lt;code&gt;this&lt;/code&gt;的绑定&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_this&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clickHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;clicked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;_this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clickHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里 CoffeeScript 对于&lt;code&gt;this&lt;/code&gt;有简单的别名&lt;code&gt;@&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="扩展"&gt;扩展&lt;/h3&gt;
&lt;p&gt;在 js 中，所有的对象都是开放的，有时候会扩展原有对象的行为 (比如对数组的 ECMA5 shim)，这也称为 Monkey patching&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="na"&gt;String&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;dasherize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt; &lt;span class="sr"&gt;/_/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"-"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;::&lt;/code&gt;代表原型的引用，js 代码如下&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dasherize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/_/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="类"&gt;类&lt;/h3&gt;
&lt;p&gt;在 js 中是否要模拟传统编程语言的类，是个一直以来都有争议的话题，不同的项目，不同的团队，在类的使用上会有不同的看法，不过，一旦决定要使用类，那么至少需要一套良好的实现，CoffeeScript 在语言内部实现了类的模拟，我们来看一看一个完整的例子&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Gadget&lt;/span&gt;
  &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;CITY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"beijing"&lt;/span&gt;

  &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

  &lt;span class="na"&gt;constructor&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt;

  &lt;span class="na"&gt;sell&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="s"&gt;"Buy &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; with &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nx"&gt;_price&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; in &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CITY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;iphone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iphone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4999&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt; &lt;span class="nx"&gt;iphone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; "iphone"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt; &lt;span class="nx"&gt;iphone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sell&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; "Buy iphone with 4999 in beijing"&lt;/span&gt;

&lt;span class="nx"&gt;ipad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ipad"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3999&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt; &lt;span class="nx"&gt;ipad&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sell&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; "Buy ipad with 3999 in beijing"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个 Gadget 类具有通常语言中类的功能：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;constructor&lt;/code&gt;是构造函数，必须用这个名称，类似 ruby 中的 initialize&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt;是实例变量，可以通过&lt;code&gt;iphone.name&lt;/code&gt;获取&lt;/li&gt;
&lt;li&gt;构造函数中如果给实例变量赋值，直接将&lt;code&gt;@name&lt;/code&gt;写在参数中即可，等价于在函数体中的&lt;code&gt;@name = name&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_price&lt;/code&gt;是私有变量，需要赋初始值&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sell&lt;/code&gt;是实例方法&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create&lt;/code&gt;是类方法，注意这里使用了&lt;code&gt;@create&lt;/code&gt;，这和 ruby 有些像，在定义时的&lt;code&gt;this&lt;/code&gt;指的是这个类本身&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CITY&lt;/code&gt;是类变量&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;要注意的是，对于实例方法，要用&lt;code&gt;=&amp;gt;&lt;/code&gt;来绑定&lt;code&gt;this&lt;/code&gt;，这样可以作为闭包传递，比如&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;iphone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iphone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4999&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#sell"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;iphone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sell&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果不用&lt;code&gt;=&amp;gt;&lt;/code&gt;，闭包被调用时就会丢失实例对象的值 (&lt;code&gt;iphone&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;对于熟悉基于类的面向对象编程的人，CoffeeScript 的类是一目了然的，下面来看看对应的 js 代码&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;__bind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;me&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;me&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;Gadget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Gadget&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CITY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;beijing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;__bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Buy &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; with &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;_price&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; in &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CITY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上的代码有很多值得注意的地方&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;整体上来说，CoffeeScript 的类模拟使用的是一个&lt;em&gt;构造函数闭包&lt;/em&gt;，这是最常用的模拟类的模式，好处是可以完整地封装内部变量，且可以使用&lt;code&gt;new&lt;/code&gt;来生成实例对象&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_price&lt;/code&gt;就是被封装在闭包内部的私有变量&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sell&lt;/code&gt;这样的实例方法是原型方法，并且在初始化时使用自定义的 bind 函数绑定实例 (用&lt;code&gt;=&amp;gt;&lt;/code&gt;定义的情况)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create&lt;/code&gt;和&lt;code&gt;CITY&lt;/code&gt;这样的类成员使用构造函数的属性实现，重复一下，在 CoffeeScript 类定义中的&lt;code&gt;this&lt;/code&gt;指的是整个闭包&lt;code&gt;Gadget&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Gadget.name&lt;/code&gt;是额外定义的类名属性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="类的继承"&gt;类的继承&lt;/h3&gt;
&lt;p&gt;CoffeeScript 中为方便地实现类的继承也定义了自己的语法，我们把上面的类简化，来看一下如何继承：&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Gadget&lt;/span&gt;
  &lt;span class="na"&gt;constructor&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="na"&gt;sell&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="s"&gt;"Buy &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; 

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;IPhone&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Gadget&lt;/span&gt;
  &lt;span class="na"&gt;constructor&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iphone"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="na"&gt;nosell&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="s"&gt;"Don't &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;sell&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;iphone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;IPhone&lt;/span&gt;
&lt;span class="nx"&gt;iphone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nosell&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; Don't Buy iphone&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;extends&lt;/code&gt;关键字可以继承父类中的所有实例属性，比如&lt;code&gt;sell&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;super&lt;/code&gt;方法可以调用父类的同名方法&lt;/li&gt;
&lt;li&gt;如果不覆盖&lt;code&gt;constructor&lt;/code&gt;，则她被子类默认调用&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;来看一下对应的 js 代码，这有一些复杂，我们把和上边类定义中重复的地方去掉，只留下继承的实现部分&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;IPhone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;__extends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;({}.&lt;/span&gt;&lt;span class="nx"&gt;hasOwnProperty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; 
        &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt; 

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ctor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;constructor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 

    &lt;span class="nx"&gt;ctor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;ctor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__super__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
  &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;IPhone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_super&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nf"&gt;__extends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;IPhone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_super&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;IPhone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;IPhone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;IPhone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nosell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;__bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nosell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;IPhone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__super__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;iphone&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;IPhone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nosell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Don't &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sell&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;IPhone&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;})(&lt;/span&gt;&lt;span class="nx"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里重点有三个，&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;__extends&lt;/code&gt;函数使用了代理构造函数&lt;code&gt;ctor&lt;/code&gt;来实现继承，这是非常普遍的 js 中对象继承的实践模式，进一步解释一下

&lt;ul&gt;
&lt;li&gt;使用代理构造函数的目的是为了避免子类被更改时父类受到影响&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;ctor.prototype = parent.prototype&lt;/code&gt;的意义是只继承定义在 prototype 上的公用属性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;父类的类成员被直接引用拷贝到子类，而不是原型继承&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;super&lt;/code&gt;的实现方法是&lt;code&gt;parent.prototype.constructor.call(this)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="混入(Mixin)"&gt;混入 (Mixin)&lt;/h3&gt;
&lt;p&gt;在 ruby 语言中的 Mixin，能够让你的类获得多个模块的方法，可以说是对多重继承一种很好的实现，虽然在 CoffeeScript 中并没有像 ruby 的&lt;code&gt;include&lt;/code&gt;一样的内置功能，但很容易实现她&lt;/p&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt;
  &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; 
      &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;

  &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; 
      &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;

&lt;span class="nx"&gt;classProperties&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"find &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;instanceProperties&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"save"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt;
  &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;extend&lt;/span&gt; &lt;span class="nx"&gt;classProperties&lt;/span&gt;
  &lt;span class="vi"&gt;@&lt;/span&gt;&lt;span class="na"&gt;include&lt;/span&gt; &lt;span class="nx"&gt;instanceProperties&lt;/span&gt;

&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;继承了 Module 的类才可以 Mixin，当然，这里也可以用组合或者直接为 js 的构造函数做 Monkey patching&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;classProperties&lt;/code&gt;是类成员模块，使用&lt;code&gt;@extend&lt;/code&gt;来 Mixin，实现是简单的拷贝对象的属性&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;instanceProperties&lt;/code&gt;是实例成员模块，使用&lt;code&gt;@include&lt;/code&gt;来 Mixin，实现是拷贝对象原型的属性&lt;/li&gt;
&lt;li&gt;需要指出的是，这里的拷贝是引用拷贝，有可能外部会更改被 Mixin 的模块内部值，更好的方法是深层值拷贝 (clone)，包括 JQuery 在内的很多类库都实现了这类扩展方法&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;
&lt;h2 id="结语"&gt;结语&lt;/h2&gt;
&lt;p&gt;CoffeeScript 提供了一门比 JavaScript 更强大，优雅，表现力丰富的语言，但她毕竟架构于 JavaScript 之上，而且是静态地编译成 JavaScript 代码，也就是说，她不能完全避免对 JavaScript 中一些不良部分的滥用，比如&lt;code&gt;eval&lt;/code&gt;,&lt;code&gt;typeof&lt;/code&gt;,&lt;code&gt;instanceof&lt;/code&gt;等，所以，在任何情况下，建议始终开启&lt;em&gt;Strict Mode&lt;/em&gt;&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use strict&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;严格模式是一个 ECMA5 标准提出的 js 子集，禁用了很多 js 设计中不好的方面，在未来会逐渐成为 js 的语言标准，详细介绍在&lt;a href="https://developer.mozilla.org/en/JavaScript/Strict_mode#Changes_in_strict_mode" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;&lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Tue, 07 Aug 2012 17:19:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/4789</link>
      <guid>https://ruby-china.org/topics/4789</guid>
    </item>
    <item>
      <title>SASS 和 Compass 指南</title>
      <description>&lt;p&gt;前一段写的一篇，原载于我自己的&lt;a href="http://lilulife.com" rel="nofollow" target="_blank" title=""&gt;blog&lt;/a&gt; ，算一个简单的介绍吧，可能有一些错漏，请多包涵：）&lt;/p&gt;
&lt;h2 id="CSS预处理器"&gt;CSS 预处理器&lt;/h2&gt;
&lt;p&gt;CSS 预处理器 (CSS Preprocessor)，是一种构架于 css 之上的高级语言，可以通过脚本编译生成 CSS 代码，其目的是为了让 CSS 开发者的工作更简单有趣，当前已经进入了较为成熟的阶段，基本上新的 web 开发项目大都已普遍使用。&lt;/p&gt;

&lt;p&gt;现在最主要的选择有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://sass-lang.com/" rel="nofollow" target="_blank" title=""&gt;SASS&lt;/a&gt; 2007 年诞生，最早也是最成熟的 CSS 预处理器，拥有 ruby 社区的支持和 compass 这一最强大的 css 框架，目前受 LESS 影响，已经进化到了全面兼容 CSS 的 SCSS。&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://lesscss.org" rel="nofollow" target="_blank" title=""&gt;LESS&lt;/a&gt; 2009 年出现，受 SASS 的影响较大，但又使用 CSS 的语法，让大部分开发者和设计师更容易上手，在 ruby 社区之外支持者远超过 SASS，其缺点是比起 SASS 来，可编程功能不够，不过优点是简单和兼容 CSS，反过来也影响了 SASS 演变到了 SCSS 的时代，著名的 Twitter Bootstrap 就是采用 LESS 做底层语言的。 &lt;/li&gt;
&lt;li&gt;
&lt;a href="http://learnboost.github.com/stylus/" rel="nofollow" target="_blank" title=""&gt;Stylus&lt;/a&gt;，2010 年产生，来自 Node.js 社区，主要用来给 Node 项目进行 CSS 预处理支持，在此社区之内有一定支持者，在广泛的意义上人气还完全不如 SASS 和 LESS。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我较为推崇的组合是，&lt;strong&gt;SASS+Compass+Twitter Bootstrap+bootstrap-sass&lt;/strong&gt;，这一组合能够获得最好的底层语言 SASS，最好的框架 Compass，和 Bootstrap 提供的最强大的 UI 组件库 (被 bootstrap-sass 翻译成 SASS 的风格)。&lt;/p&gt;

&lt;p&gt;下面就对 SASS 的常用要素做一简单介绍，大部分例子来自 SASS 设计者 Hampton Catlin 的著作&lt;a href="http://pragprog.com/book/pg_sass/pragmatic-guide-to-sass" rel="nofollow" target="_blank" title=""&gt;Pragmatic Guide to Sass&lt;/a&gt;，本文&lt;em&gt;不涉及&lt;/em&gt;安装过程，命令行工具，和其他 web 开发框架 (比如 Rails) 的结合，早期非 SCSS 的语法等内容，想了解更多的朋友可深入阅读上边这本书。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="嵌套(nesting)"&gt;嵌套 (nesting)&lt;/h2&gt;&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/*CSS选择器(Selector)经常要重复class,id和element的名称*/&lt;/span&gt;
&lt;span class="nc"&gt;.infobox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200px&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.infobox&lt;/span&gt; &lt;span class="nc"&gt;.message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.infobox&lt;/span&gt; &lt;span class="nc"&gt;.message&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//SASS可以让选择器嵌套，做到DRY&lt;/span&gt;
&lt;span class="nc"&gt;.infobox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;.message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于某些需要引入父选择器名称的情况，SASS 使用&amp;amp;代替&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/*CSS会让同样元素的样式变得分散*/&lt;/span&gt;
&lt;span class="nc"&gt;.infobox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.user&lt;/span&gt; &lt;span class="nc"&gt;.infobox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.message.new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//SASS可以让他们在一起&lt;/span&gt;
&lt;span class="nc"&gt;.infobox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;.user&lt;/span&gt; &lt;span class="k"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nc"&gt;.new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于当前做跨平台 web 开发来说，&lt;code&gt;@media&lt;/code&gt;非常常用，而 SASS 的嵌套会区别对待&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/*CSS*/&lt;/span&gt;
&lt;span class="nc"&gt;.main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;    

&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;320px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;.main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;35px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//SASS让同样的选择器在不同media条件下的样式在一起&lt;/span&gt;
&lt;span class="nc"&gt;.main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="nt"&gt;screen&lt;/span&gt; &lt;span class="nt"&gt;and&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;max-width&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;320px&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;35px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id="变量(variables)"&gt;变量 (variables)&lt;/h2&gt;
&lt;p&gt;变量是编程语言的基石，掌握变量的定义和使用，是 SASS 编程的起点。&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/*CSS中同样的值不得不重复很多次*/&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#336699&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="nf"&gt;#wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#eee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="nf"&gt;#wrapper&lt;/span&gt; &lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#336699&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//SASS有了变量，只需要改一次，而且往往相关值一起定义的，方便查找&lt;/span&gt;
&lt;span class="c1"&gt;//可以定义全局变量&lt;/span&gt;
&lt;span class="nv"&gt;$primary_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#369&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$secondary_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#eee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//也可以定义局部变量&lt;/span&gt;
    &lt;span class="nv"&gt;$page_width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$primary_color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nn"&gt;#wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$page_width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$secondary_color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$primary_color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关于上边代码中的全局和局部变量，这里稍微说一下 SASS 的缺点，同名局部变量会覆盖全局变量的值，这很不自然&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//SASS这一点不如LESS&lt;/span&gt;
&lt;span class="nv"&gt;$color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;           
&lt;span class="nc"&gt;.scoped&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="nv"&gt;$color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        
&lt;span class="p"&gt;}&lt;/span&gt;                        
&lt;span class="nc"&gt;.unscoped&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;     
    &lt;span class="c1"&gt;// LESS = black (global)&lt;/span&gt;
    &lt;span class="c1"&gt;// SASS = white (overwritten by local)&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;          
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有了变量，自然可以进行对值的计算&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Calculating in SASS&lt;/span&gt;
&lt;span class="c1"&gt;//以下代码中修改页面宽度只需要改一次&lt;/span&gt;
&lt;span class="nv"&gt;$width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$sidebar_percent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="mi"&gt;.2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nn"&gt;#page&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nn"&gt;#sidebar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$sidebar_percent&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="nn"&gt;#content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$sidebar_percent&lt;/span&gt;&lt;span class="p"&gt;);}&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;变量还可以嵌入字符串中，这在编程语言中称为&lt;strong&gt;插值&lt;/strong&gt;(Interpolating)&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nt"&gt;CSS&lt;/span&gt; 
&lt;span class="nc"&gt;.car.bmw_make&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;   
&lt;span class="nc"&gt;.car.bmw_make&lt;/span&gt; &lt;span class="nc"&gt;.image&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url("images/bmw.png")&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Interpolating in SASS&lt;/span&gt;
&lt;span class="nv"&gt;$car&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bmw"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;.car.&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nv"&gt;$car&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="nc"&gt;_make&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;s&lt;/span&gt;&lt;span class="err"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;.image&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url("images/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nv"&gt;$car&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;.png")&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id="函数(function)"&gt;函数 (function)&lt;/h2&gt;
&lt;p&gt;在编程语言中，函数是仅此于变量的基本结构体，SASS 中有很多预定义函数，这里用颜色相关的函数举例如下&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/*CSS需要定义整套颜色*/&lt;/span&gt;
&lt;span class="nc"&gt;.main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#336699&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.lighten&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#6699cc&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.saturate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1466b8&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;    
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//SASS只需要定义一个基本颜色，其他可以通过函数获取&lt;/span&gt;
&lt;span class="nv"&gt;$main_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#336699&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;.main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$main_color&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.lighten&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;lighten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$main_color&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;20%&lt;/span&gt;&lt;span class="p"&gt;);}&lt;/span&gt;    
&lt;span class="nc"&gt;.saturate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;saturate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$main_color&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;30%&lt;/span&gt;&lt;span class="p"&gt;);}&lt;/span&gt;    
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SASS 的底层函数相当完整，如果会使用 ruby 的话，也可以自定义函数，完整列表在&lt;a href="http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="导入(import)"&gt;导入 (import)&lt;/h2&gt;
&lt;p&gt;在样式表过于复杂的时候，你可以将其按功能模块分割成不同的文件进行开发，SASS 会将这些小文件统一编译成一个完整的 CSS 文件，与简单的包含多个文件不同，SASS 的导入，是可以将变量，Mixin，等等一起导入的&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//_colors.scss(被导入的SASS文件，通常用_开头，它们在编译过程中不会生成CSS文件)&lt;/span&gt;
&lt;span class="nv"&gt;$main_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#336699&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//application.scss 导入文件&lt;/span&gt;
&lt;span class="c1"&gt;//SASS会自动加上_去寻找文件&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"colors"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nn"&gt;#page&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$main_color&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id="扩展(extend)"&gt;扩展 (extend)&lt;/h2&gt;
&lt;p&gt;&lt;a href="/extend" class="user-mention" title="@extend"&gt;&lt;i&gt;@&lt;/i&gt;extend&lt;/a&gt;可以复制其他 class 或 id 的指定样式，让你无须再将逻辑上不相关的 class 放在一起，当然更不用复制粘贴了&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nt"&gt;CSS&lt;/span&gt;
&lt;span class="nc"&gt;.blue_button&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.checkout_button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#336699&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.blue_button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.checkout_button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//SASS @extend&lt;/span&gt;
&lt;span class="nc"&gt;.blue_button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#336699&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.checkout_button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@extend&lt;/span&gt; &lt;span class="nc"&gt;.blue_button&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id="混入(mixin)"&gt;混入 (mixin)&lt;/h2&gt;
&lt;p&gt;Mixin 可以说是 SASS 等 CSS 预处理语言最强大的要素了，简单来说，mixin 可以将一部分样式抽出，作为单独定义的模块，被很多选择器重复使用。&lt;/p&gt;

&lt;p&gt;Mixin 可以定义在单独文件中&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//_text.scss&lt;/span&gt;
&lt;span class="k"&gt;@mixin&lt;/span&gt; &lt;span class="nt"&gt;blue_text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#336699&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;helvetica&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arial&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-variant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;small-caps&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;   
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;导入并使用 mixin&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;.product_title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;blue_text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;mixin 与 extend 看似实现的功能差不多，但实际上除了语义上的不同外，mixin 更为强大和复杂，因为她有参数 (arguments)，参数还可以有默认值&lt;/p&gt;

&lt;p&gt;实现跨浏览器圆角&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Cross browser Rounded borders mixin &lt;/span&gt;
&lt;span class="k"&gt;@mixin&lt;/span&gt; &lt;span class="nt"&gt;rounded_borders&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;color&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;width&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;5px&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;rounding&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;5px&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;-moz-border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$rounding&lt;/span&gt; &lt;span class="nv"&gt;$rounding&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="na"&gt;-webkit-border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$rounding&lt;/span&gt; &lt;span class="nv"&gt;$rounding&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="na"&gt;-khtml-border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$rounding&lt;/span&gt; &lt;span class="nv"&gt;$rounding&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="na"&gt;-o-border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$rounding&lt;/span&gt; &lt;span class="nv"&gt;$rounding&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$rounding&lt;/span&gt; &lt;span class="nv"&gt;$rounding&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$width&lt;/span&gt; &lt;span class="nv"&gt;$color&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;rounded_borders&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;#336699&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;3px&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实现跨浏览器透明度&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Cross browser Opacity mixin&lt;/span&gt;
&lt;span class="k"&gt;@mixin&lt;/span&gt; &lt;span class="nt"&gt;opacity&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;opacity&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opacity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nv"&gt;$opacity&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// IE 5-9+&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$opacity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;opacity&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="nc"&gt;.6&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id="迭代(each)"&gt;迭代 (each)&lt;/h2&gt;
&lt;p&gt;在主流语言中，迭代属于循环实现的一种功能，例如 ruby 的 each 或者 python 的 for in，sass 使用&lt;a href="/each" class="user-mention" title="@each"&gt;&lt;i&gt;@&lt;/i&gt;each&lt;/a&gt;实现&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/*CSS中要写很多同样的代码*/&lt;/span&gt;
&lt;span class="nc"&gt;.thom_picture&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url("/image/thom.jpg")&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.jonny_picture&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url("/image/jonny.jpg")&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.colin_picture&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url("/image/colin.jpg")&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;span class="nc"&gt;.phil_picture&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url("/image/phil.jpg")&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//SASS使用@each变得非常简单&lt;/span&gt;
&lt;span class="k"&gt;@each&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;member&lt;/span&gt; &lt;span class="nt"&gt;in&lt;/span&gt; &lt;span class="nt"&gt;thom&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;jonny&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;colin&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;phil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;.&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nv"&gt;$member&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="nc"&gt;_picture&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url("/image/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nv"&gt;$member&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;.jpg")&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id="条件(condition)"&gt;条件 (condition)&lt;/h2&gt;
&lt;p&gt;说到编程基本控制流，除了循环就是条件了，sass 中使用&lt;a href="/if" class="user-mention" title="@if"&gt;&lt;i&gt;@&lt;/i&gt;if&lt;/a&gt;进行条件控制&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//判断式中可以使用==/&amp;gt;/&amp;lt;等通常判别符&lt;/span&gt;
&lt;span class="k"&gt;@mixin&lt;/span&gt; &lt;span class="nt"&gt;country_color&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;country&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@if&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;country&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nt"&gt;france&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;@else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.england&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;country_color&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;england&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.france&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;country_color&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;france&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id="Compass"&gt;Compass&lt;/h2&gt;
&lt;p&gt;以上 SASS 的基本要素都介绍的差不多了，不过对于在实践中使用 SASS 来说，强大的&lt;a href="http://compass-style.org/" rel="nofollow" target="_blank" title=""&gt;Compass&lt;/a&gt;是必不可少的，她由 SASS 的核心团队成员 Chris Eppstein 创建，是一个非常丰富的样式框架，包括大量定义好的 mixin，函数，以及对 SASS 的扩展。&lt;/p&gt;

&lt;p&gt;这里非常简要地介绍一些常用功能&lt;/p&gt;
&lt;h3 id="Reset"&gt;Reset&lt;/h3&gt;
&lt;p&gt;Compass 提供一个基于大名鼎鼎的 Eric Meyer 的 Reset CSS，我还没有和 Twitter Bootstrap 采用的 Normalize.css 一一比对过，不过 compass reset 的好处是可以分不同的模块 reset&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//compass reset&lt;/span&gt;
&lt;span class="c1"&gt;//global reset&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"compass/reset"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//partial reset &lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"compass/reset/utilities"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="CSS3"&gt;CSS3&lt;/h3&gt;
&lt;p&gt;前边提到的圆角和透明 mixin 实际上都在 Compass 中提供，当然还有几乎所有的 css3 相关模块，实际上有了 Compass，不需要再写任何浏览器特定的代码了。&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//compass rounder corners&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"compass/css3/border-radius"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;border-radius&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;4px&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.header_top_left_rounded&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;border-top-left-radius&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;4px&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="Typography"&gt;Typography&lt;/h3&gt;
&lt;p&gt;Compass 有很多基本 mixin 可以方便地定制各种表现层元素&lt;/p&gt;

&lt;p&gt;比如水平列表，这个在顶部导航栏中相当常用&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Compass&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"compass/typography/lists/horizontal-list"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="nc"&gt;.horiz&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;horizontal-list&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;4px&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们看一眼在 css 中的对应实现多么复杂&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/*CSS实现*/&lt;/span&gt;
&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="nc"&gt;.horiz&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="py"&gt;zoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="nc"&gt;.horiz&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;list-style-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;list-style-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;nowrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="nc"&gt;.horiz&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="nd"&gt;:first-child&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="nc"&gt;.horiz&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="nc"&gt;.first&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;padding-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="nc"&gt;.horiz&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="nd"&gt;:last-child&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;padding-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="nc"&gt;.horiz&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="nc"&gt;.last&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;padding-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="Layout"&gt;Layout&lt;/h3&gt;
&lt;p&gt;Compass 也提供一些影响布局的方法，比如将一个元素延展 (Stretch)&lt;/p&gt;

&lt;p&gt;HTML 如下&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"stretch_box"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"stretched&amp;gt;
        Stretched fully!
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//compass stretching&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"compass/layout/stretching"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//stretched fully&lt;/span&gt;
&lt;span class="nc"&gt;.stretched&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;stretch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//stretched with gap&lt;/span&gt;
&lt;span class="nc"&gt;.stretched&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;stretch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;12px&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;12px&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;12px&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;12px&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//stretched horizontally&lt;/span&gt;
&lt;span class="nc"&gt;.stretched&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;stretch-x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="Utilities"&gt;Utilities&lt;/h3&gt;
&lt;p&gt;Compass 还有很多实用功能模块，比如很烦人但在布局中经常要使用的 clearfix，有了这个 mixin，就不需要再定义一个 clearfix 的 class，然后污染 outer_box 的 html 了&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Compass clearfix&lt;/span&gt;
    &lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"compass/utilities/general/clearfix"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nn"&gt;#outer_box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;clearfix&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nn"&gt;#inner_box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外一个强大的功能是 css sprites，原来我们经常用 photoshop 手动生成这张集合了所有小图标的大图片，修改和维护如同噩梦，现在有了 compass，一切轻松了。&lt;/p&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;//compass sprites&lt;/span&gt;
&lt;span class="c1"&gt;//combines all images in icon folder into one&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"icon/*.png"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//"movie" is the origin icon's file name&lt;/span&gt;
&lt;span class="nc"&gt;.movie_icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nt"&gt;icon-sprite&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;movie&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;整篇介绍到这里就结束了，其实，无论是 SASS 这样的 CSS 预处理器，还是 Compass 这样的框架，要达成的目的都是一致的，那就是遵循&lt;strong&gt;DRY&lt;/strong&gt;, &lt;strong&gt;可读性&lt;/strong&gt;, 和&lt;strong&gt;正交化&lt;/strong&gt;的设计原则，让我们的生活变得更轻松快乐。&lt;/p&gt;

&lt;hr&gt;</description>
      <author>lilu</author>
      <pubDate>Wed, 18 Jul 2012 15:57:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/4396</link>
      <guid>https://ruby-china.org/topics/4396</guid>
    </item>
    <item>
      <title>聊聊主流框架，Less/Sass/Compass/Bootstrap/H5bp</title>
      <description>&lt;h2 id="SASS and LESS"&gt;SASS and LESS&lt;/h2&gt;
&lt;p&gt;不管是&lt;a href="http://sass-lang.com/" rel="nofollow" target="_blank" title=""&gt;SASS&lt;/a&gt;，还是&lt;a href="http://lesscss.org" rel="nofollow" target="_blank" title=""&gt;LESS&lt;/a&gt;，都可以视为一种基于 CSS 之上的高级语言，其目的是使得 CSS 开发更灵活和更强大，这两者我的感觉是对于程序员来说，SASS 的功能要远比 LESS 强大，基本可以说是一种真正的编程语言了，而对于设计师，LESS 则相对清晰明了，&lt;a href="http://css-tricks.com/sass-vs-less/" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;是 Chris Coyier 写的一篇关于 SASS 和 LESS 的背靠背对比，可以说是相当中肯的 (评论也相当有料喔)。当然，如果使用 Rails 之类的框架，基于 SASS 是会来的更方便一些。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="Compass and Blueprint"&gt;Compass and Blueprint&lt;/h2&gt;
&lt;p&gt;SASS 和&lt;a href="http://compass-style.org/" rel="nofollow" target="_blank" title=""&gt;Compass&lt;/a&gt;的关系，在很多人来看类似于 ruby 和 rails，compass 基于 SASS，是一个真正意义上的编程框架，提供了大量的 mixin(可理解为函数库)，无论是对 css3 繁杂的多浏览器写法的简化支持，还是实现各种常见功能的 helper，都是强大而丰富的。另外，包括 Scott Davis 和 Eric Meyer 的核心团队，也可以说是全明星组合。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.blueprintcss.org/" rel="nofollow" target="_blank" title=""&gt;Blueprint&lt;/a&gt;是一套预定义的样式，包括对大部分常用 web 交互组件的渲染，并且有一个强大的格子布局系统 (grid system)，即使不懂设计的程序员，也可以使用 blueprint 的默认样式做出很漂亮的页面。&lt;/p&gt;

&lt;p&gt;Blueprint 和 Compass，是一个分工很明确的组合，前者负责样式渲染，后者则是基础框架和模块，可以说，在 bootstrap 诞生之前，是 web 开发首选的黄金组合。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="HTML5 Boilerplate"&gt;HTML5 Boilerplate&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://html5boilerplate.com/" rel="nofollow" target="_blank" title=""&gt;HTML5 Boilerplate&lt;/a&gt;项目 (以下简称 h5bp) 则如同名字一样，实现的是一个 web 页面的标准模板，尤其针对 html5 进行了全面优化，同时也对老浏览器向后兼容，基本上来说，h5bp 与样式相关的主要部分，是 compass 的一个子集，不过 h5bp 并不只限于 css，还默认引入了很多很好的 js 开发库，包括&lt;a href="http://modernizr.com/" rel="nofollow" target="_blank" title=""&gt;Modernizr&lt;/a&gt;和 Jquery，再加上一个标准化的 index.html 模板&lt;/p&gt;

&lt;p&gt;h5bp 是这里提到的所有框架中使用起来最方便的，当然受功能限制，她最适用的目标是单页 web app 或者静态页面，对于复杂的项目来说，需要和其他框架做互补。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="Twitter Bootstrap"&gt;Twitter Bootstrap&lt;/h2&gt;
&lt;p&gt;新兴而野心十足的 Bootstrap 跟上述又都不同，她是基于 LESS 的一套前端工具库，意图非常明显，想以一个项目，整合 Compass，Blueprint，h5bp 的目标功能，成为 web 前端的一站式解决方案。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;一套完整的基础 css 模块，但不如 compass 丰富和强大&lt;/li&gt;
&lt;li&gt;一套预定义样式表，包括一个格子布局系统，和 blueprint 提供的差不多，只是设计风格不一样&lt;/li&gt;
&lt;li&gt;一组基于 Jquery 的 js 交互插件，这是 Bootstrap 真正强大的地方，也是她严格意义上可以取代 Blueprint 的原因所在，这些非常不错的小插件，包括对话框，下拉导航等等，不但功能完善，而且十分精致，正在成为众多 jquery 项目的默认设计标准。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;特别提一下，Bootstrap 使用&lt;a href="http://necolas.github.com/normalize.css/" rel="nofollow" target="_blank" title=""&gt;Normalize.css&lt;/a&gt;来进行 Reset CSS，这一项目已经成为了事实标准 (超过 Compass 的 Eric meyer 2.0)，强烈推荐使用，另外前边说的 h5bp 也使用 Normalize，因此，如果你在项目中同时使用了 h5bp 和 Bootstrap，请注意，&lt;strong&gt;没有必要再引入 h5bp 的初始样式表 style.css&lt;/strong&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="So What?"&gt;So What?&lt;/h2&gt;
&lt;p&gt;说了一大堆，该来点结论了，目前对于 web 开发，尤其是由程序员进行的 full stack 开发，最好的组合是：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SASS+Compass+Bootstrap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这样既可以利用 SASS 强大的编程能力，Compass 强大的底层函数，又可以获取 Bootstrap 丰富的 UI 组件支持。&lt;/p&gt;

&lt;p&gt;只是，Bootstrap 是基于 LESS 的，要让她们协同工作，需要一个 SASS 的 Bootstrap 移植版本，幸亏 github 上从来不缺这类项目，当前最好的一个是&lt;a href="https://github.com/thomas-mcdonald/bootstrap-sass" rel="nofollow" target="_blank" title=""&gt;bootstrap-sass&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/ericguo" class="user-mention" title="@ericguo"&gt;&lt;i&gt;@&lt;/i&gt;ericguo&lt;/a&gt; 特别去看了一下 bootstrap-rails 的代码，发现 bootstrap-rails 和 bootstrap-sass 在对 bootstrap 的翻译上实现几乎一致，只是一些名字上的不同，不过我只是过了一遍相对较复杂的 mixin.scss 的内部实现，可能其他模块有比较大的差异也说不定：）&lt;/p&gt;

&lt;p&gt;在实现差不多的情况下，bootstrap-sass 我认为还是稍好一点，因为可以很方便地支持 compass，无论有无 rails，都可以挂成 compass 的扩展，这点虽然不需要很多代码实现，但还是很有用的，毕竟用 sass 和 rails 的人基本都需要 compass 和 bootstrap 一起工作吧。&lt;/p&gt;

&lt;hr&gt;</description>
      <author>lilu</author>
      <pubDate>Tue, 17 Jul 2012 16:47:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/4370</link>
      <guid>https://ruby-china.org/topics/4370</guid>
    </item>
    <item>
      <title>我的 Emacs 24 配置</title>
      <description>&lt;p&gt;&lt;a href="https://github.com/Lilu/my-emacs" rel="nofollow" target="_blank"&gt;https://github.com/Lilu/my-emacs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;emacs24 only&lt;/p&gt;

&lt;p&gt;欢迎任何 pull request  &lt;/p&gt;</description>
      <author>lilu</author>
      <pubDate>Fri, 04 May 2012 14:20:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/3074</link>
      <guid>https://ruby-china.org/topics/3074</guid>
    </item>
  </channel>
</rss>
