これまで(第3回まで)に見てきたプログラム例から、以下のような、
Rubyの特徴(或いは、RubyやPythonを契機に広まった、最近のプログラミングスタイルの
特徴と考えてもいい)を、理解していこう。
これは長所でもあり短所でもある、と言えるだろう。
括弧で囲んでも囲まなくてもいい
引数のない関数呼び出しは、空の括弧 () を後置してもいいしなくてもいい。
だとすると、関数(の呼出し)と変数(の参照)が文法的に識別できないことになる。
実際、
gets=10
としたあと、
gets
と呼ぶと、関数 gets が呼ばれず、変数 getsに代入してある値 10 が返される。
関数名と同じ名前の変数があるときに参照された時は、変数名が優先される。
この時に関数呼び出しを行うためには、明示的に空括弧を後置して
gets()
と呼ぶ必要がある。
変数経由
関数のネスティング(関数の値を次の段の関数に引数として渡す)
x=gets
puts(x)
と、
puts(gets())
の意味が同じ。
静的型付言語の多くは Bool型、Boolean型といった真理値を表すデータ型を持っている。
Rubyにも true, false といった、その型に似せた特殊なデータはあるが、 その専用のデータを使わなくても条件判定(while, if などで使う条件式)はできる。
Rubyでは false と nil だけが 真理値でいう「偽」に相当する値で、
それ以外の値はすべて(条件式の中では)「真」だと扱われる。
C言語で、数値の 0 だけが 「偽」を表していたのと感覚的には似ているかも知れない。
そのため、下のような書き方ができる。
while gets do ...
while(gets) do ...
# 条件式に真理値を明示的に返す書き方をする必要があるなら下のようになる
while(gets!=nil) ♯ 注)下の 5.2. を利用した書き方
while((line=gets())!=nil) ...♯ 注)下の 5.1 を利用した書き方
こうした特性を使わずにこの読み込みループを書くとしたらどうなるか、
イメージしてみて下さい(かなり複雑です)。
(まずは歴史的に眺めてみる)
クラスとインスタンス:
Rubyでは下図のようなクラス階層が形成されている。
オブジェクト指向言語では、同じ名前(演算子として見えるものについては、同じ記号)でも対象となるオブジェクト(の属するクラス)が違うと、 違った意味のメソッド/関数/演算子 になることがある。
Object : : Numeric Integer Float : : String :
1+1
は、
+
の左にある被演算子 1
が整数(Integer)なので、+
を意味する)が呼ばれ、”abc"+"def"
は、
+
)が呼ばれ、