7つの言語7つの世界 Ruby 2日目

探してみよう

試してみよう

感想等

感想

クラスさえもClassクラスのインスタンス。全てがオブジェクト。
そしてModule.classはClassで、Module.class.superclassはModuleで…と頭がこんがらがりそう。
mixinの仕組みは便利ですね。Enumerableはいろんな演算を抽象化していて面白い。
試してみようはTree.rbがあんまりすっきり書けてない感じ。
本文に「このレベルの抽象化でも少しは優れたプログラミング言語になるが、Rubyの真の秘術が登場するのはまだまだこれからだ。」と書いているので次の章が楽しみです。

疑問点
  • PHP 5.4のtraitもmixinのようなものなのかな?
メモ
  • 配列やハッシュやシンボルのリテラルは書き方いくつかあるので詳しくはhttp://doc.ruby-lang.org/ja/1.9.2/doc/spec=2fliteral.htmlを見る
  • 配列
    • [ ]や[ ]=はArrayクラスのメソッド、なのでundefined_variable[0] = 'hoge'とか宣言してない変数の[0]に値を入れようとするとメソッドないよとエラーが出る
    • Rangeを渡したり-1を渡したり使いやすい。キュー、リスト、スタック、セットのように使えるし、どんな型でもok多重配列もok
  • ハッシュ
    • 試しに['hoge' => 'hoge', 0 => 'foo']って書いたら{'hoge' => 'hoge', 0 => 'foo'}を要素に持つ配列が出来た。ちょっと予想外
    • 同じシンボルは同じオブジェクト、文字列が必要なわけじゃないけど、名前が必要、そんな時に用いるらしい
      • 名前付きの引数もハッシュで再現出来る、関数の最後の引数を囲むブレースが省略可能なおかげ
  • Rubyが本当の力を発揮するのは、コードブロックを使い始めたとき」
  • コードブロック
    • 詳しくはhttp://doc.ruby-lang.org/ja/1.9.2/doc/spec=2fcall.htmlを参照
    • 名前のない関数のようなもの、関数やメソッドに引数として実行可能なコードを受け渡し出来る
    • 用途
      • ファイルの角行の処理
      • HTTPトランザクション内で処理
      • コレクションに対して複雑な演算
      • 他にも至るところでブロックが使われる
    • Rubyの慣習では1行だけのコードブロックはブレースで、複数業にまたがるコードブロックはdo/endで囲む
  • クラス
    • 継承関係
      • 全てのクラスの親はObject(1.9ではBasicObject)
      • クラスはClassのインスタンス
      • Classのインスタンスはオブジェクトのテンプレート
      • Classの親はModule
    • 慣習、規則
      • クラスは大文字で始まりキャメルケース
      • インスタンス変数とメソッド名は小文字で始まり、区切りにアンダースコア
      • 定数は全て大文字で書く
      • インスタンス変数の先頭には@をつける
      • クラス変数の先頭には@@をつける
      • 判定用の関数とメソッドには通常、疑問符をつける
      • アクセッサを定義するメソッドがModuleで定義されている(http://doc.ruby-lang.org/ja/1.9.2/class/Module.html)
        • attrとattr_accessorがよく使われる
  • モジュール
    • クラスに混ぜ込んで(mixinして)使う、モジュールで定義した振る舞い、定数がクラスの一部となる
    • モジュールは複数のクラスメソッドに依存していることが多い
    • Javaでは明示的にinterfaceを実装するがRubyではダックタイピングによって暗黙的に
  • mixin
    • Flavorsで初めて導入、SmalltalkPythonなどでも使われている。
    • 最も重要なmixinはEnumerableとComparable
      • Enumerableはeachを実装しておけばany?とかall?とかselectとかinjectとか便利なメソッドが使えるように
      • Comparableは<=>(宇宙船演算子)を定義しておけば比較演算が出来るようになる
Reia

p24のtree.rbの例に書いてあったもの。
Reia Programming Language
Erlang VM(BEAM)上で動くRuby-likeな言語らしい。
でももう開発止まっててこれ以上何かを追加する計画はないので興味があるならElixirをチェックしろと書いてますね。
面白そう。Erlangの章読んだらまたチェックしたい。

本見ながら書いたもの

tree.rb

to_file.rb

遊び