2008年5月3日土曜日

Chapter 11 Threads and Processes

要点のみ


  • Mutithreading
    Ruby threads.
    in-processでありportable。multi-coreの恩恵はなし。
    いろいろ落とし穴はあるけど便利。

    • Creating Ruby Threads
      Thread.new(hoge) do |var|
      ...
      end
      が基本構文。

    • Manipulating Threads

      なぜjoinの名付けたかがわからない。

    • Thread Variables

      Thread.current["mycount"]
      とすると、各thread間でアクセス可能となる。

    • Threads and Exceptions

      特になし。


  • Controlling the Thread scheduler
  • Mutual Exclusion

    • Monitors
    • Queus
    • Condition Variables

  • Running Multiple Processes

    • Spawning New Processes
    • Independent Children
    • Blocks and Subprocesses



以上、まとめて特になし。

2008年5月2日金曜日

Chapter 10 Basic Input and Output

要点のみ。

RubyのI/Oは、見た目、二種類。

Kernel moduleに stdioがらみのmethodがたくさん定義されている。これを使う。
IO Objectsを使う。


  • What Is an IO Object?

    IO class ← File class
    IO class ← BasicSocket class

    IO Objectsは双方向のchannelsをもつ。

  • Opening and Closing Files

    特になし。

  • Reading and Writing Files

    特になし。


    • Iterators for Reading

      Iteratorを使うと、とてもコンパクトに書ける。

      IO.foreach("testfile") {|line| puts line }

    • Writing to Files

      putsとかは、引数を自動的にto_sする。

    • But I Mis My C++ iostream

      特になし。

    • Doing I/O with Strings

      StringIO。IOの流儀を文字列的対象に対して実施できる。


  • Talking to Networks

    特になし。

Chapter 9 Modules

要点のみ。

Modulesの利点は2つ。
名前空間の提供
mixin機構

  • Namespaces

    module Trig
    PI = 3.14
    def Trig.sin(x)
    ...
    end
    が構文例。
    Trig.sin
    Trig::PI
    とアクセス。

    上の例は、クラスメソッドな書き方。
    mixinするときは、インスタンスメソッドとして書く。

    module Debug
    def who_am_i?
    ...
    end
    class Phonograph
    include Debug
    ...
    end

    なんぞ。このincludeはコピーではなく参照なり。
    module側の関数からclassの中のmethodもcallできる。

  • Iterators and the Enumerable Module

    rubyのCollection classの機能を自前classにももたせたいとき、
    継承ではなく、mixinという手もある。そのときはEnumeration module
    をincludeする。

  • Composing Modules

    method callしたときに何が呼ばれるかは、動的スコープ、ということかな?
    それがどのクラスで定義されているかとか、どのモジュールで定義されている
    かは関係なく、実行時に参照されるものが実行される?


    • Instance Variables in Mixins

      通常mixinするモジュールにはinstance変数をもたせない。
      持つこともある。
      持っている場合、mixinしたときに名前がぶつかると、混乱する。
      idで、object id を参照できるので、状態を扱うにあたって、
      instance variablesではなく、hashを使うという手もある。

    • Resolving Ambiguous Method Names

      effective method orderの話。

      object -> mixin -> superclass ->superclass へのmixin -> ...


  • Including Other Files

    loadとrequire。
    requireは一回だけ。
    loadとrequireする対象ファイルのtop level変数は、そのファイル
    の中だけをスコープとする。

2008年5月1日木曜日

Chapter 8 Exceptions, Catch, and Throw

引き続き要点のみ。


  • The Exception Class
    Exceptionは情報として、エラーメッセージ文字列とbacktraceをもつ。

  • Handling Exceptions

    • System Errors
    • Tidying Up
      構文は、

      begin
      ...
      rescue
      ...
      ensure
      ...
      end

    • Play it Again
      rescureの中のretryで、beginに再入する。


  • Raising Exceptions

    • Adding Information to Exceptions

  • Catch and Throw
    Catch とThrowはgoto文みたいなものかな。

Chapter 7 Expressions

要点だけ書いていく。

--
値を返してしかべき、ものは値を返す。これが信頼ということか。

* Operator Expressions
かなりのOperatorは、実はmethod callであるとのこと。ここも関数型に近いところかな。

あと、[]みたいな変なのもある。
class Song
def [](from,to)
result = Song.new(...
...
とすると、
song[0, 15].play
とできる。


* Miscellaneous Expressions

** Command Expansion

`date`でOSのコマンドの出力が文字列で返る。

exit statusはグローバル変数$?に入る。


* Assignment

代入も値を返す。

a = (b = 1 + 2) + 3

objectsのattributesへの代入は、実はmethod callである。

song.duration = 234

というのは、

song.duration=(234)

であり、duration=というmethodである。


** Parallel Assignment

a, b = b, a

で値の入れ替えができる。

配列の分解ができる。

a = [1, 2, 3, 4]
b, c = a
b -> 1
c -> 2

ここらへん、パターンマッチ的。
構造ももてる。

b, (c, d), e = 1, [2,3], 4
b, (c, d), e = 1, [2,3], 4


** Other Forms of Assignment

a += 2

というのは、def +(other)で定義されるmethodとな。
これは、

a + 2

としても使える。+=とできるのはどういう仕組みだんだろ?


* Condtional Execution

** Boolean Expressions

nil と false 以外はtrue。0もtrue。

** The Value of Logical Expressions

if と unless も値を返す。


* Case Expressions

caseも値を返す。


* Loops

特になし。


* Variable Scope, Loops, and Blocks

while, untilとforはスコープをつくらない。

iteratorのスコープは奇妙。

x = nil
y = nil
[1,2.3].each do |x|
y = x + 1
end
[x,y] -> [3,4]

だそうな。

2008年4月29日火曜日

Chapter 6 More about Methods

うーん。だんだんチュートリアル調がタルくなってきた。
Part IIIからやればよかったかな。

お、*rest が使える。

def varargs(arg1, *rest)
...

restはArrayになると。

Iteratorについては、methods定義の際に&で明示的に引数指定された場合だけ、Proc objectに自動変換されるのか。そいで、その呼び出しはyieldではなく、.callとなる。

method を call するとき、receiver をomitすると、selfだということになる。
selfって? おお、あのselfか。pythonでよく見る。

すべての method はvalueを返す。関数型的な側面?
returnもある。大域脱出。

おお、*で多値ができるのか。

irb(main):006:0> def five(a, b, c, d, e)
"I was passed #{a} #{b} #{c} #{d} #{e}"
end
def five(a, b, c, d, e)
"I was passed #{a} #{b} #{c} #{d} #{e}"
end
nil
irb(main):009:0> five(*(10..14).to_a)
five(*(10..14).to_a)
"I was passed 10 11 12 13 14"
irb(main):010:0>

ああ、ちゃう、これは多値じゃない。わからん、Ocamlにあったかね。

あ、lambdaだ。これはProc objectをつくる、と。

keyword parameter は無い。代わりにhashを使う、と。
これ、書きぶりはkeyword parameterとほぼ同じ。

Chapter 5 Standard Types

うう。

6.times do ... end

とか、気持悪くないか。。。
覚えていけば、問題はないが。

#{expr}は便利。ヒアドキュメントも便利。
これらもある意味、宣言的なのかな。

パターンマッチ的に代入できる。

file, length, name, title = line.chomp.split(/\s*\|\s*/)


Rangeも宣言的といえば宣言的。
Rubyが使い易いと言われるのは、宣言的な構文糖衣が充実しているからなのかな?