LoginSignup
50
50

More than 5 years have passed since last update.

CoffeeScriptとJavaScriptやPythonやRubyの文法の比較

Last updated at Posted at 2012-12-26

PythonやRubyだとあんな感じで書くけど、CoffeeScriptだとどうかなーというのを思い浮かぶがままに書き下していく。

  • JavaScriptも追加

コメント

# comment
# comment
// comment
# comment

複数行にまたがるコメント

Pythonには複数行コメントがないので文字列で代用する

'''
comment
'''

"""
comment
"""
=begin
comment
=end
/*
comment
*/
###
comment
###

文字の埋め込み

>>> width = 100
>>> "{0}px".format(width)
"100px"
>>> "%dpx" % width
"100px"
width = 100
p "#{width}px"
# => 100px
width = 100;
console.log("" + width + "px");

Rubyに似てる

width = 100
console.log "#{width}px"
# 100px

複数行にまたがる文字列

>>> a = '''a
... b'''
"a\nb"
a = 'a
b'
# => "a\nb"
a = 'a\
      b';
// "a\n     b"
a = 'a
b'
# "ab"

連想配列

d = {'a': 0, 'b': 2}
d = {:a => 0, :b => 2}
d = {a: 0, b: 2}
d = a: 0, b: 2
d = {a: 0, b: 2} # もOK
# 複数行にまたがる場合は`,`を省略可
d =
  a: 0  # 途中にコメントも入れられる
  b: 2
d = {
  a: 0
  b: 2
}

配列

l = [1, 3, 5]
l = [1, 3, 5]
l = [1, 3, 5]
l = [1, 3, 5]
#複数行にまたがる場合は`,`が省略可
l = [
  1
  3
  5
]

連続した配列

>>> range(5)
[0, 1, 2, 3, 4]
>>> range(5, 0, -1)
[5, 4, 3, 2, 1]
>>> range(2, 5)
[2, 3, 4]
[0...5]
# [0, 1, 2, 3, 4]
[0..4]
# [0, 1, 2, 3, 4]

[4...-1]
# [4, 3, 2, 1, 0]
[4..0]
# [4, 3, 2, 1, 0]

[2...5]
# [2, 3, 4]
[2..4]
# [2, 3, 4]

配列へのアクセス

>>> l = range(10)
>>> l[1]
1
>>> l[2:4]
[2, 3]
>>> l[2:]
[2, 3, 4, 5, 6, 7, 8, 9]
>>> l[:4]
[0, 1, 2, 3]
>>> l[::3]
[0, 3, 6, 9]
>>> l[-1]
9
>>> l[3:6] = [6, 8, 9]
>>> l
[0, 1, 2, 6, 8, 9, 6, 7, 8, 9]
l = [0...10]
l[1]
# 1
l[2...4]
# [2, 3]
l[2...]
# [2, 3, 4, 5, 6, 7, 8, 9]
l[...4]
# [0, 1, 2, 3]
i for i in l by 3
# [0, 3, 6, 9]
l[l.length-1]]
# 9
l[3...6] = [6, 8, 9]
# [0, 1, 2, 6, 8, 9, 6, 7, 8, 9]

リスト内包表記

単純な場合

>>> l = ['a', 'b', 'c']
>>> [v for v in l]
['a', 'b', 'c']
>>> [(i, v) for i, v in enumerate(l)]
[(0, 'a'), (1, 'b'), (2, 'c')]
>>> d = {'a': 0, 'b': 1, 'c': 2}
>>> [k for k in d]
['a', 'b', 'c']
>>> [(k, v) for k, v in d.items()]
[('a', 0), ('b', 1), ('c', 2)]
l = ['a', 'b', 'c']
v for v in l
# ['a', 'b', 'c']
[v for v in l]
# [ ['a', 'b', 'c'] ]
[i, v] for i, v in l
# [[0, 'a'], [1, 'b'], [2, 'c']]
d = a: 0, b: 1, c: 2
k for k of d
# ['a', 'b', 'c']
[k, v] for k, v of d
# [['a', 0], ['b', 1], ['c', 2]]

リスト内包表記を使ったフィルタリング

>>> [i for i in range(10) if i % 3 == 0]
[0, 3, 6, 9]
i for i in [0...10] when i % 3 is 0
# [0, 3, 6, 9]

CoffeeScriptのリスト内包表記はもっといろいろできる

>>> for i in range(5)
...     print i
0
1
2
3
4
console.log i for i in [0...5]
# 0
# 1
# 2
# 3
# 4

関数

def func(arg, *args):
    pass
def func(arg, *args)
end
var func = function(arg) {
  var args = 2 <= arguments.length ? Array.prototype.slice.call(arguments, 1) : []
}
func = (arg, args...) ->

関数呼び出し

Pythonは関数呼び出しに()が必須

>>> def foo(): return 'foo'
>>> foo
<function __main.foo>
>>> foo()
'foo'

Rubyは不要

def foo
  'foo'
end
p foo
# => foo
def bar(x)
  x
end
p bar 'bar'
# => bar

JavaScriptはインスタンス生成時は不要。普通の呼び出し時は必須

var foo = function() {return 'foo'};
console.log(typeof foo);
// 'function'
console.log(foo());
// 'foo'
f = new foo;
console.log(f.construoctor === foo);
// true

CoffeeScriptは引数が渡されない場合は()が必要、引数ありの場合は不要

foo = -> 'foo'
console.log typeof foo
# 'function'
console.log foo()
# foo
bar = (x) -> x
console.log foo 'bar'
# bar

関数の戻り値

PythonとJavaScriptはreturn必須。無ければPythonならNoneが、JavaScriptならundefinedが返る。

>>> def bar(): 'bar'
>>> bar() is None
True
var bar = function() { 'bar' };
console.log(bar === undefined);
// true

RubyとCoffeeScriptは最後の文がreturnされる。

def bar
  'bar'
end
bar
# => 'bar'
bar = -> 'bar'
bar()
# 'bar'

クラス

>>> class Klass(object):
...     def __init__(self, name):
...         self.name = name
>>> k = Klass('hoge')
>>> k.name
"hoge"
class Klass
  attr "name"
  def initialize(name)
    @name = name
  end
end
k = Klass.new 'hoge'
p k.name
# => hoge
function Klass(name) {
  this.name = name;
}
var k = new Klass('hoge');
console.log(k.name);
// hoge
class Klass
  constructor: (name) ->
    @name = name
k = new Klass 'hoge'
console.log k.name
# hoge

継承

>>> class Parent(object):
...     def foo(self):
...         print 'parent'
>>> class Child(Parent):
...     def foo(self):
...         super(Child, self).foo()
...         print 'child'
>>> c = Child()
>>> c.foo()
parent
child
class Parent
  def foo
    p 'parent'
  end
end
class Child < Parent
  def foo
    super
    p 'child'
  end
end
c = Child.new
c.foo
# => parent
# => child
function Parent() {}
Parent.prototype.foo = function () { console.log('parent'); };
function Child() {}
Child.prototype = new Parent;
Child.prototype.foo = function () {
  Parent.prototype.foo.call(this);
  console.log('child');
}
var c = new Child;
c.foo();
// parent
// child
class Parent
  foo: ->
    console.log 'parent'
class Child extend 
  foo: ->
    super
    console.log 'child'
c = new Child
c.foo()
# parent
# child

Mixin

module Fooable
  def foo
    p 'foo'
  end
end
class Klass
  include Fooable
end
k = Klass.new
k.foo
# => 'foo
# https://gist.github.com/993415
class Mixin
  augment: (t) ->
    (t[n] = m unless n == 'augment' or !this[n].prototype?) for n, m of this
class Fooable extends Mixin
  foo: ->
    console.log 'foo'
class Klass
  constructor: ->
    Fooable::augment @
k = new Klass
k.foo()
# foo
50
50
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
50