mrubyとmruby/cがある、というのは調べたが、そもそも言語仕様をよく知らないので、軽く調べておこう。
ただ、ここで「入門」で調べると、「変数とは」とかから始まって、中身を調べるまでがきつい。
なので「C Ruby」とか「Java Ruby」とかで検索して、知っている言語との違いや、こっちにあってこっちにない、のようなところを見ていく。
といいつつ、ちょっとやっただけの言語も知っている部類で書くので、間違ってたら済まんです。
- 変数宣言が特にないようだ
- 変数名の1文字目でいろいろ決まる
- スコープは、ローカル、インスタンス、クラス、グローバル
- 擬似変数というものがある。C++のthisみたいなやつ。
- 組み込み変数というものがある。argv[]みたいな感じか。
- 定数かどうかも変数名の1文字目で決まる
- 基本的にオブジェクト
- 「23.to_s()」みたいに書ける
- JavaScriptみたいに、型がない
- 変数名でわかるようにするのが推奨なのかな?
- コメントはbashみたいに#で始まる
- 複数行コメントはなさそう
- 行の終わりは、pythonみたいにセミコロンがあってもなくてもよい
- 演算子は、C++みたいに一部は再定義できる
- 代入は、普通に=でできる
- ifなどの制御構造が、Cと違って値を返すものがある
- たとえばifの場合、条件分岐のifと、修飾子のifがある
- 条件分岐のif
- elseifでも、else ifでもなく、elsif
- elseもある
- thenもある
- 終わりは、end
- 修飾子のif
- 「実行式 if 評価式」みたいに書けて、評価式がtrueだったら実行式を処理する、みたいになる
- switch-case-defaultじゃなくて、case-when-else-end
- ifが真の条件で評価するのに対し、偽の条件で評価するunlessがある
- unlessにも、条件分岐と修飾子がある
- 条件分岐にはelsifがない(elseはある)
- throwじゃなくて、raiseで例外を投げる
- try-catchではなく、begin-rescue-endで例外を捕捉する
- finallyではなく、ensureらしい
- 例外が発生しなかったときに通るelseがあるらしい
- 戻り値はreturn
- 基本的にオブジェクトで、オブジェクトはクラスかモジュールに属する
- なので、関数を作りたかったらクラスのメソッドを使って呼ぶ
- ・・・と思うけど、どうなんだろう? あとで試す
- モジュールは、クラスっぽいけど特殊扱いらしい
- nullじゃなくて、nil
- thisじゃなくて、self
- includeじゃなくて、require
- ファイル名を書くけど、相対パス指定で書くのが良いのか?
さあ、いくつか試してみよう。
まずは、関数というかメソッド。
クラスを作らずにdefできるのだろうか?
【test1.rb】
def func()
return "hello\n"
endprint func()
$ ruby test1.rb
hello
普通に動いた。
じゃあ、これはJavaみたいにファイル名と結びついたtest1というクラスなのだろうか?
class()というメソッドで属するクラス名がわかるらしいので、見てみよう。
【test2.rb】
def func()
return self.class()
endprint func()
$ ruby test2.rb
Object
予想と違った。
Objectは、Javaのように全てのクラスのスーパークラスとのこと。
うーん、でも、Objectから派生したクラスじゃなくて、直接Objectに属しているということになるのか?
あるいは、どこにも属していないから、やむなくObjectと表示しているだけなのか。
いや、class()の例に、self.class()でObjectと出力されているな。
では、クラスのメソッドにしてみよう。
$ ruby test3.rb【test3.rb】
class Klass
def func()
return self.class()
end
enda = Klass.new
print a.func()
Klass
ふむ、地の文のselfはObjectクラスに属しているということか。
別ファイルにしてみよう。
$ ruby test4.rb【Klass.rb】
class Klass
def func()
return self.class()
end
end【test4.rb】
require './Klass.rb'a = Klass.new
print a.func()
Klass
同じディレクトリだからといって、"./"を書かなかったらダメだった。
と、ここまで何も考えずにprint文を使ったけど、これは一体何だろう?
【test5.rb】
print print.class()
$ ruby test5.rb
NilClass
nilじゃなくて、NilClassなんだ。
nilは変数で、そのクラスがNilClassとのこと。
まあ、クラス名じゃ操作できないから、そうなるか。
じゃあ、NilClassにprintメソッドが属するのも変な気がするが、printはKernelモジュールに属しているそうだ。
そうだね、出力がnilだから、NilClassになったというだけなのだね。
そしてKernelモジュールは全てのクラスが参照できるとのこと。
「Objectクラスのメソッドは実際にはこのモジュールで定義されています」とあるが、さっき使ったclass()は載ってないな。
まあ、1回ざっと見ただけで言語仕様がわかるわけでもないので、このくらいで止めておこう。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。