2016/07/02

[勉]Ruby

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"
end

print func()

$ ruby test1.rb
hello

普通に動いた。
じゃあ、これはJavaみたいにファイル名と結びついたtest1というクラスなのだろうか?

class()というメソッドで属するクラス名がわかるらしいので、見てみよう。

【test2.rb】
def func()
    return self.class()
end

print func()

$ ruby test2.rb
Object

予想と違った。
Objectは、Javaのように全てのクラスのスーパークラスとのこと。
うーん、でも、Objectから派生したクラスじゃなくて、直接Objectに属しているということになるのか?
あるいは、どこにも属していないから、やむなくObjectと表示しているだけなのか。

いや、class()の例に、self.class()でObjectと出力されているな。
では、クラスのメソッドにしてみよう。

【test3.rb】
class Klass
    def func()
        return self.class()
    end
end

a = Klass.new
print a.func()

$ ruby test3.rb
Klass

ふむ、地の文のselfはObjectクラスに属しているということか。


別ファイルにしてみよう。

【Klass.rb】
class Klass
    def func()
        return self.class()
    end
end

【test4.rb】
require './Klass.rb'

a = Klass.new
print a.func()

$ ruby test4.rb
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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。