Rubyプロジェクトに関わりそうなので、Rubyに触れて学んだことを逐次書いていこうとおもいます。
筆者のバックグラウンド
- PHP歴、JavaScript歴12年~
- Scala, Go 2年くらい
- Python 賞味3ヶ月くらい
Rubyを最新にする
Rubyのバージョンを確認してみる。
$ ruby --version
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin15]
2.2.3、2015年8月15日のものらしい。このRubyはMacビルトインのものだろうか?Homebrewで入れたものだろうか?
% which ruby
/usr/local/bin/ruby
どうやら、Homebrewで入れていたものらしい。きっと、Ruby系のDevOpsツールを入れた時に同時に入っていたものだろう。
アップグレードしてみる:
$ brew upgrade ruby
$ ruby --version
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
2.3になった。今日時点で最新と思われる。
CodeRunnerのRubyバージョンを確認する
puts RUBY_VERSION
こちらも2.3.0になっている。
他の言語の知識を活用する
プログラミングが初めてでなければ、他の言語と比較した記事が役立つと思う。
PHPer向けのRuby入門 - Qiita
[Ruby]他言語使用者のためのRuby入門知識まとめ - Qiita
一通り目を通して、予習する。
出力系関数を確認する
Rubyコードスニペットを書きながらRubyを体に叩き込む。そのために、まずは出力系関数を確認する。
Ruby | PHP | Scala |
---|---|---|
puts x | echo $x . PHP_EOL; | println(x) |
print x | echo $x; | print(x) |
p | var_dump($x); | println(x) |
文字列出力には、puts
、変数をダンプするにはp
を使うと良いようだ。
puts [1,2,3]
p [1,2,3]
print [1,2,3]
print "hello"
1
2
3
[1, 2, 3]
[1, 2, 3]hello
Ruby 2.3の言語仕様を読む
体系的に言語仕様を知っておきたいので、Hello Worldから始まる入門書ではなくリファレンスを読んでみる。オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル (Ruby 2.3.0)。
Rubyの特徴
- インタプリタ
- 変数に型が無い (動的型付け)
PHPやJSと似てると見える。ScalaやGoとは違う。
- ユーザによるメモリ管理が不要
- 全てがオブジェクト
- クラス、継承、メソッド
- クロージャ
- 強力な文字列操作/正規表現
- 例外処理機能
ふむふむ。今までやってきた言語にもありそうなやつだな。
- 単純な文法
この辺はVagrantfileのDSLなどでお世話になってます。
- 変数宣言が不要「変数の種類(ローカル変数、グローバル変数、インスタンス変数など)は 変数名から知る事ができます。」
おお、これはどういうことだろう!後で変数名の仕様を確認しよう。
- 特異メソッド「ある特定のオブジェクトにメソッドを付加することができます。」
初めて聞く用語。JSとかでオブジェクトにメソッド生やしたりしていたけれど、それと同じものだろうか?
- モジュールによるMix-in「Rubyは多重継承は複雑さの源であるという見地から、 意図的に多重継承を持っていませんが、 モジュールを使ってクラス階層を横断して実装を共有できます。」
ScalaやPHPのtraitとはどう違うんだろう?
- ブロック付きメソッド呼び出し(イテレータ)「制御構造の抽象化を援助するブロック付きメソッド呼び出しという機能があります。」
- ダイナミックローディング「OSが許せば、オブジェクトファイルを実行時に読み込む機能が提供されます。」
この辺は想像がつかないので後で確認しよう。
変数と定数
「変数の種類(ローカル変数、グローバル変数、インスタンス変数など)は 変数名から知る事ができます。」というのが気になったので、早速「変数」について見てみる。変数と定数 (Ruby 2.3.0)
Rubyには変数名に次のルールがあるらしい。
- ローカル変数: 小文字または
_
で始まる - インスタンス変数:
@
で始まる。PHPなら$this->
。CoffeeScriptの@
の元ネタはこれかな? - クラス変数:
@@
で始まる。PHPならself::
/static::
。 - グローバル変数:
$
で始まる。 - 定数:アルファベット大文字 ([A-Z]) で始まる
またクラス定義式はクラスオブジェクトの生成を行うと同時に、 名前がクラス名である定数にクラスオブジェクトを代入する動作をします。
class C
end
p C # => C
クラスの定義は定数的なものなのか!
つづく