CoffeeScriptを書いてみたよ その3

CoffeeScriptの練習の続き。

for文

# for文と即時関数
for i in [0..5]
  do (i) ->
    console.log i  # 0, 1, 2, 3, 4, 5

# 2つ目のプロパティを取得する
obj =
  aaa: 1
  bbb: 2
  ccc: 3
c = (i for i of obj)[2]
console.log c  # ccc

配列関連

# ちょっと特殊な配列の置き換え
a = [1, 2, 3, 4, 5]
a[1..4] = [1, 2, 4, 6]
console.log i for i in a  # 1, 1, 2, 4, 6

# 配列の最初の10個を取得する
b = (i for i in [0..100])[0..10]
console.log b  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

try-catch

# 関数内に直接try-catch
console.log(  # 括弧が必要
  try
    ___aaa___
  catch e
    null
)  # null

オペレータ

# 各種オペレータ
1 is 1               # 1 === 1
1 isnt 2             # 1 !== 2
not 1                # !1
1 and 1              # 1 && 1
1 or 2               # 1 || 2
true and yes and on  # true and true and true
false or no or off   # false or false or false

@property            # this.property

# of -> in
for i of {a: 1, b: 2, c: 3}  # for (i in {a: 1, b: 2, c: 3}) {
  do (i) ->                  #   console.log(i)
    console.log i            # }

# in
if 'r' in 'strawberry'
  console.log 'r'  # 'r'
if 4 in [1, 2, 3, 4, 5]
  console.log 4  # 4

変数の初期化

# 変数が定義されているか調べる
if param?
  console.log param
else
  console.log 'none'  # 'none'

# obj = obj || {}
# 変数が定義されていない場合のみ初期化
object ?= {}
object = aaa ? {}

クラス関連

# クラス
class Base

  # コンストラクタ
  constructor: (@name) ->

  aaa: (before, after) ->
    console.log before + @name + after

# 継承
class Extend extends Base

  aaa: (str) ->
    super '/', "/ #{str}"

base = new Base('base')
extd = new Extend('extd')
base.aaa 'before', 'after'
extd.aaa 'str'

# prototype
obj = {}
obj::aaa = ->                      # obj.prototype.aaa = function() {
  console.log 'obj.prototype.aaa'  #   console.log('obj.prototype.aaa');
                                   # }

トリッキーなコード

# 変数同士の入れ替え
a = 1; b = 2; c = 3
[a, b] = [b, a]
console.log a  # 2
console.log b  # 1

[a, b, c] = [c, a, b]
console.log a  # 3
console.log b  # 2
console.log c  # 1

# 部分的に取り出す?
aaa =
  bbb: 1
  ccc: 2
  ddd:
    eee: '_eee_'
    fff: [
      'ggg'
      'hhh'
    ]
{ddd: {first, second: [_1, _2]}} = aaa
console.log _1 + ' ' + _2  # 'ggg hhh'

# 最初と最後を単一の変数で、間を配列で受け取る
str = '123456789'
[start, items..., end] = str.split ''
console.log start  # 1
console.log items  # [2, 3, 4, 5, 6, 7, 8]
console.log end    # 9


わかりにくいというのと簡単に書けるっていうのは紙一重なのかな。
後半の書き方はしないかなーと思った。