第129回 クロージャは作られたときの状態を保持するわけではなく参照する

第55回 クロージャ - bingo_nakanishiの他言語出身者のためのPerl入門
第56回 クロージャの実践的使いどころ - bingo_nakanishiの他言語出身者のためのPerl入門
第58回 クロージャをもっとていねいに - bingo_nakanishiの他言語出身者のためのPerl入門

私は今まで、「クロージャは作られたときの状態を保持する」という言い方をしてきたが、
これは厳密には間違いだったようだ。

状態を保持しているように見える例

use strict;

sub h{
  my $c = shift;
  sub { $c++ };
};

my $h = h(5);
print $h->(), "\n";
print $h->(), "\n";
print $h->(), "\n";


結果:

5
6
7

この例だと、確かに作られたときの状態を持っており、その状態に変化を加えているように見える。


厳密に言うと「作られたときの変数を参照している」

しかし、次の例を見てみると、

use strict;

sub h{
  my $c   = shift;
  my $fun = sub { $c++ };  # ここで作った

  $c = 10;                 # $cを変更

  return $fun;             # 作った関数を返すのはココ
}

my $h = h(5);
print $h->(), "\n";
print $h->(), "\n";
print $h->(), "\n";


結果:

10
11
12

このように、$cは作られたときではなく、$c = 10;が実行されたものを見ている。
つまりこれは、関数が作れたときの状態を保持するのではなく、作られたところの外側の変数をただ参照していることを示している。



同じ変数をクロージャとして持つ関数を2つ返してみる

use strict;

sub h{
  my $c   = shift;
  [
   sub{ $c++; print $c, "\n" },
   sub{ $c++; print $c, "\n" }
  ];
}

my($fun1, $fun2) = @{h(5)};

$fun1->();
$fun1->();
$fun2->();
$fun1->();


結果:

6
7
8
9

このようにお互いに同じ変数をクロージャとして持つ場合は、
参照であるので、お互いの関数は同じ$cを更新している。


Rubyでも念のために見てみる

class Hoge
  def foo
    c = 1
    [1,2,3].each do |i|
                     c=c+1    # cを更新
                     puts c
                 end
    puts
    puts c                    # cが更新されているのがわかる
  end
end

Hoge.new.foo


結果:

2
3
4

4

確かに外側のcが更新されている。


ただクロージャをよく使う場面を考えると

クロージャをよく使う場面を考えると、
「参照」という言葉よりも、
「作られたときの状態を保持する」
という表現の方がしっくりくる気がする。

第130回 Javaを始めるにあたって読んだ本

私はJavaは得意ではない。
だが、世の中にはやらなければならないということがあるのだ。

Javaの「仕組み」・「文法」

Java 謎+落とし穴 徹底解明 (標準プログラマーズライブラリ)

Java 謎+落とし穴 徹底解明 (標準プログラマーズライブラリ)

Javaポインターはないと誰がいったのだろう。
確かにポインターはないかもしれないが、
もう全部「参照」と言ってもいいくらいなのがJava
というか「参照」がわかっていないとなにもできないということに気づかせてくれる本。




詳解 Javaプログラミング第2版〈VOLUME1〉

詳解 Javaプログラミング第2版〈VOLUME1〉

Sun SJC-P認定ガイド 310-055対応

Sun SJC-P認定ガイド 310-055対応

この2冊でJavaの仕組みや文法を学んだ。
ただ、分量が多いので、
正直Java初学者には読むのに時間がかかりすぎた感も否めない。




徹底攻略 Javaアソシエイツ問題集[310-019]対応 (ITプロ/ITエンジニアのための徹底攻略)

徹底攻略 Javaアソシエイツ問題集[310-019]対応 (ITプロ/ITエンジニアのための徹底攻略)

徹底攻略 Java2 プログラマ問題集 Platform5.0 対応 (ITプロ/ITエンジニアのための徹底攻略)

徹底攻略 Java2 プログラマ問題集 Platform5.0 対応 (ITプロ/ITエンジニアのための徹底攻略)

本当にJavaの文法を理解したのだろうか?
そして知識の定着ぶりはどうだろうか?
それを黒本で試した。



Javaの用語

Javaをやっていると、「この単語って何を意味しているんだ....」
という場面によく出くわす。特に私がわからなかったのが
「コンテナ」という単語。
「入れ物」という意味合いはわかっていたが、
Java的にはなにが「入れ物」なのだろうか?
GUIプログラムを少し覗いてみると理解できるかもしれない。


Eclipse

Eclipse 実践開発入門 -Java・オープンソース開発・Eclipse3.2

Eclipse 実践開発入門 -Java・オープンソース開発・Eclipse3.2

Eclipseを使わないJava開発は今や考えられないのではないだろうか。
Eclipseの機能は「どんだけあんねん! てか、その設定ってどこからできんねん!」
と言いたくなるほどいっぱいある。この本で、ざっと機能を掴める。


Javaオブジェクト指向

豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向

豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向

すいすい習得 UMLモデリング (豆蔵セミナーライブオンテキスト (2))

すいすい習得 UMLモデリング (豆蔵セミナーライブオンテキスト (2))

Java・オブジェクト指向の壁を突破する 抽象化プログラミング入門 (豆蔵セミナーライブオンテキスト 3)

Java・オブジェクト指向の壁を突破する 抽象化プログラミング入門 (豆蔵セミナーライブオンテキスト 3)

Javaというとオブジェクト指向
Perlでもオブジェクト指向
Rubyオブジェクト指向
JavaScriptだってオブジェクト指向


その中で、
オブジェクト指向って「こういうモノ!」と強く主張しているのがJava界隈のように感じる。
そんなJava界隈で通じるオブジェクト指向をこの3冊で学べる。
シーケンス図はこの本で理解できました。
クラスを作って、インスタンスを生成するJavaの世界にさあ行こう。


小話系

15歳からはじめるJAVAわくわくゲームプログラミング教室―Windows98/2000/Me/XP対応

15歳からはじめるJAVAわくわくゲームプログラミング教室―Windows98/2000/Me/XP対応

何気なく買ってみたのだけど、
System.out の outが参照しているオブジェクトなどの小話が随所にあり面白かった。



コレクションフレームワーク

Javaコレクションフレームワーク

Javaコレクションフレームワーク

コレクションフレームワークを使わないと、
Javaの開発は困難を極めるかもしれない。
あと普通に開発でコレクションフレームワークは使われているので
わかってないと置いてきぼりをくらう。
しかし、Perlの配列とハッシュだけあればいいのではないか?
MapとPerlのハッシュってなにが違うんだ....などの思考が理解を邪魔し、
コレクションフレームワークは先輩の方や友人にもかなり教えていただきました。


JavaでのWEBアプリ

一番やさしいJSP & サーブレット入門塾 第2版 (DB Magazine SELECTION)

一番やさしいJSP & サーブレット入門塾 第2版 (DB Magazine SELECTION)

APサーバという単語を学生時代には聞いた事がなく
どういうモノをさすのだろうかと思い買ったもの。
JavaでWEBアプリを作るときのサーバ構成の基本はこのように構成する
といったようなことが学べた。




Webコンポーネントディベロッパ(SJC-WC) (SUN教科書)

Webコンポーネントディベロッパ(SJC-WC) (SUN教科書)

WEBコンポーネントについての本。
Javaではこの仕様に基づき作っていく事になる。




徹底攻略Webコンポーネントディベロッパ問題集―310-081対応 (ITプロ/ITエンジニアのための徹底攻略)

徹底攻略Webコンポーネントディベロッパ問題集―310-081対応 (ITプロ/ITエンジニアのための徹底攻略)

やはり知識の定着具合を確かめるため黒本を用いた。