せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【アルゴリズム】【Ruby】 else if と elsif の違い とか。

アルゴリズムを理解するために、この本を読みました。2日で。。

読み終わったので、面白かったところのメモなど。


 

文字リテラル、とは

(ダブルクオテーション「”」は)、プログラムにとっては
単なる文字の並びでしかないものと、プログラム本体とを区別するために必要なものです。
””で囲まれた文字列を文字リテラルと呼びます

なるほど!
「リテラル」って何なのかいまいち分かっていないけど、
プログラム本体ではないところ、と言われたら確かにそうかも。
このあたりは、Rubyオライリー本に期待。


 

P47 フラグよりも「無限ループ+break」

フラグでプログラムの流れを制御すると、
大抵分かりにくいプログラムになってしまいます。

確かに。while文書くのが苦手だったけど、頑張って慣れるぞ。



 

P81 インタープリタはソースを解釈しながら実行

インタープリター方式は、インタープリタというプログラムが
解釈しながら実行します

いまさらだけど、インタープリタとコンパイラの違いが分かったかも。
インタープリタもコンパイラも道具なんだね。
人間が「おい!このソースを実行しろ!」って言ったときに
「へへー。やるでごわす」っていうのがコンパイラ(orインタープリタ)。
 

インタープリタが、ソースから機械語への変換を行うことはありません

ふーん。「実行」であって「翻訳」ではないのか。


PHPの勉強のときから気になっているのだけど、
例えば

 "hoge".object_id

と書いたとして、「object_id」メソッドの定義はどこに書いてあるのかな。
Objectクラスで定義されているのはわかるのだけど
「Object.rb」っていうファイルはない。

このあたりもオライリー本に期待。


 

elsif と else if の違い ~ぶら下がり構文

C、Javaではif文のブロックを省略できる

if (hoge == "jj")
	文
if (hoge == "jj") 文

これは、以下と同値

if (hoge == "jj") {
	文
}

省略した形を「ぶら下がり構文」と言うみたい。

 
で、ごく普通に見かける、[else if]構文、↓

if (hoge == "jj") {
	文1
} else if(huga = "kk") {
	文2
}

本の中で

else if 構文は、else節に次のif文がぶら下がり文として
付いてくるわけですが

と書いてあって、目がテン。

言われたらほんとだよ!
当たり前に書いていたけど、ぶら下がってる!

省略せずに書いたら

if (hoge == "jj") {
	文1
} else {
	if(huga = "kk") {
		文2
	}
}

になるよ!

だから、Rubyは後置if文の形式を取るから、else if が実現できないんだ。
だから、elsif という新しいキーワード(?)が生まれたんだ。


 

P99 副作用のある式は単独で書く

式の中で出力させて処理終了ってコード、やっぱり良くないんだな。
やめよう。


 

P113 去勢されたGOTO

break continue 中途return など、「去勢されたgoto」であれば
それを使うことをためらう必要はまったくないと思います。

なるほどー。
確かに一種のGOTOと見ることができる。

C言語を知らない「若造」なもんで、
「GOTOは昔のわるい習慣のもの」みたいな認識しかないけど、
改めてこれくらい古い本を読むと「なぜGOTOが悪いのか」が書いてあって面白い。

 

P117 例外は本当に例外的な場合にだけに使う

Java例外は、言うならば、CのGOTOの代わりとして出てきた概念。

一応SIerの端くれとして
「業務の例外例外クラスでハンドリングするな」というルールは分かっている。
けど、その理由は

例外の扱いをヘマして、元例外を握りつぶしたりすると困るから

という理由だと思っていた。
GOTOの後続、という概念に沿って考えるなら、

処理の流れが例外によってぶちぎれてしまうから、コードが読みづらくなる

という理由もあるんだ。

Rubyにも大域脱出という考え方があるけど、これはGOTOぽい考え方。


 

Javaの「クラス」は構造体+モジュール

構造体・・・データのかたまり
モジュール・・・メソッドのかたまり

class Hoge {
	private int age;
	private String name;
	public void method(){}
}

なるほど。二つの機能がまとまったものなんだ。
Rubyのモジュールも、言われてみたらnewメソッドを持たず、
インスタンスを作ることができない。
モジュールって「メソッドのかたまり」というイメージがあるのか。

このあたりもオライリー本に期待。


 

P222 マルチプルインスタンス

オブジェクト指向では、同時に複数のインスタンスを作り出すことが出来ます。
。。
これこそがオブジェクト指向という設計技法の本質です。

うーん。なるほど。
ちょっと分かってきたかも。


おしまい。
面白かったー。