2012年11月2日金曜日

5日目:慣れてきた!かな?

Ruby勉強5日目!

今日も読み続ける。
だんだんサンプルコードも悩まずに理解できるようになってきた。

・&をつけると、Procオブジェクトと処理ブロックを変換できる。
処理ブロック→Proc

def func(&callback)
  p callback
  callback.call("callback arg")
end
func do |i|
  p i
end
func関数の引数に&が入ってますね。この変数に処理ブロックがProcオブジェクトに変換された値が入ります。

Proc→処理ブロック

proc = Proc.new do 
  p "func"
end
2.times(&proc)
2.timesの引数に&procを渡しています。&を省略するとエラーが出ます。


・extendsの代わりに、<

class MyClass < Object
end


・staticはクラス内でクラス名.メソッド名というメソッドを定義する。
ちなみに、クラスは定数だそうです。だから、Objectは::Objectとも書ける。

・クラス名.new()でインスタンス化。
クラスメソッドでインスタンス化するようなスタイルはとてもわかりやすくてイイ!
コンストラクタメソッドはinitializeだそうです。

・attr_accessor :インスタンス変数
でアクセサメソッドの作成。attr_reader,attr_writerもある。
便利ね。
class MyClass < Object
  def initialize(value="defalut")
    @value = value
  end
  attr_accessor :value
end
myObject = MyClass.new
p myObject.value
attr_xxxに渡せるのはシンボル。
。。。Javaプログラマの私は、ここで、ん?となる。
「ん?シンボルでインスタンス変数が指定できるの?」
実は、attr_accessor :value は attr_accessor "value"とも書ける。
んー。どういうこと?

・え?def func= value end って、何事?
メソッドに、値代入????
なんだろ、と思っていたんですが、Rubyって、メソッド名の最後に=が使えるらしい。
だから、「func」が関数名なんではなくて、「func=」が関数名。
class MyClass
  def func= value
    p "oh... "+ value
  end
end
myObj = MyClass.new()
myObj.func=("value")
と書ける。ふーん。
でも、試してた所、最後に=がつくメソッド名は、クラスにつける時と、グローバルに付ける時と意味がかわるっぽい。



def func= value
  p "oh... "+ value
end
func=("value")
だと、何も出力されない。トップレベルの関数はObjectクラスのメソッド追加になるらしいんだけれど、なんで実行されないの????誰か知っていたら教えて下さい。


・aliasでメソッド名に別名を付けられる。
def func
  p "func"
end
alias dummy func
dummy
な感じ。

・オーバーライドメソッドの中でsuperとやると、オーバーライドしている親クラスのメソッド実行。
やめてよ!( )なしで処理を実行するの!
クラスをfreezeすれば変更できなくなるので、私はそうします。

・$で始まる変数は組込み変数
例えば$>は標準出力
コチラ参照
http://doc.ruby-lang.org/ja/1.8.7/class/Kernel.html

・大文字もしくは_で変数宣言すると定数。
でも、値は上書きできちゃう。ワーニングは出るけれども。
ダメっしょ、上書きさせちゃ。

・::変数名はトップレベルの定数
::CONSTANTは、実はObject::CONSTANTのObjectが省略されたもの。

・クラス名も定数。
::MyClassで参照できる。

・メソッドのスコープ定義はあとからメソッド名をシンタックス定義して変更できる。



class MyClass
  def func
  end
  private :func
end
myObj = MyClass.new()
myObj.func();
モチロン、これはエラーとなります。

・オブジェクトにメソッドを追加できる。その名も特異メソッド
obj = Object.new
def obj.func(value)
  p value
end
obj.func("data")

defって柔軟ね。

・オブジェクトのクラスにもメソッドを追加できる。
obj = Object.new()
class << obj
  def func
    p "new func"
  end
end
obj.func
こんな書き方。


・selfとthisの違い。
selfはクラスを示すことがある。


class MyClass
  p self.class #このselfはクラスを示す
  def func
    p self #このselfはインスタンス化時のオブジェクトを示す。thisと一緒
  end
end
こんな感じ。

・コメントは#でかける。
// や /* */ はダメ。たぶん、Rubyはビバ正規表現だからでしょう。

・モジュール
メソッドの中身を持てるインターフェースって感じでしょうか。


module MyModule
  def funcModule
    p "module func called"
  end
end

class MyClass
  include(MyModule)
end

myObj = MyClass.new()
myObj.funcModule()


ん?でも、これって、多重継承の悪の歴史を繰り返してない?どのメソッド実装が使われるか曖昧だから、多重継承って避けられてた気が。。。
確認!


module MyModule
  def funcModule
    p "module func called"
  end
end
module MyModule2
  def funcModule
    p "module2 func called"
  end
end
class MyClass
  include(MyModule)
  include(MyModule2)
end

myObj = MyClass.new()
myObj.funcModule() 
出力されるのは"module2 func called"。
後からincludeしたほうがそれまでのメソッドを上書きしてこの動きになっているのは予想通りなんですが、いいのかな?

・宇宙演算子 <=> 名前がカッコイイ。
比較演算子で、左辺、右辺の大小で-1,0,1を返す。
名前がカッコイイ。

・モジュールの中にクラスが書ける。

module MyModule
  class MyClass
    def func
      p "print"
    end
  end
end

ほう。
ちなみにインナークラスも書ける。

class MyClass
  class MyInnerClass
    def func
      p "print"
    end
  end
end
myObj = MyClass::MyInnerClass.new()
myObj.func()


・::の連続って、なぁに?
よくRubyのサンプルコードで、Foo::Bar::Hoge とか見ますよね。
::は定数呼び出しですよね。定数の定数?あ、そういえば、クラスは定数なんでした。
じゃ、モジュールも定数っぽいですよね。じゃ、入れ子のモジュールか?
確認。

module MyModule
  module MyInnerModule
    module MyInnerInnerModule
      class MyClass
        def func
          p "print"
        end
      end
    end
  end
end
myObj = MyModule::MyInnerModule::MyInnerInnerModule::MyClass.new
myObj.func()
そういう事ですか。納得。

・オーバーロードは出来ない。
残念。

・requireで他ファイルの読み込み
ファイルrequired.rb

###required.rb######
class Required
  print "this is Required class"
end
####################

を用意して、

require("required.rb")
Required.new()
requireでそれを読み込むと、外部ファイル定義のクラスが呼び出せます。.rbは省略可。
require("required") #.rbは省略可
Required.new()



0 件のコメント:

コメントを投稿