初めてのイテレータ

うわーもう、イテレータとかドキドキしちゃうなーもう。初体験

どんなものよ?ググってみよう!

def IF(b)
    yield if b
end
IF (true) {
    p 'gufufu'
}
"gufufu"

なんだこれー!でも、JavaScript 2.0の資料で yield ってあったな!チャンス!一石にちょう!

関数みたいにやると yeield ってやったとこでブロックが呼ばれる!

自分でもなんか書いてみよう。

def it 
    p 'ahaha'
    yield
    p 'uhuhu'
    yield
    p 'ehehe'
end
it { p 'gufufu' }
"ahaha"
"gufufu"
"uhuhu"
"gufufu"
"ehehe"

眠いからもう帰る!

おやすみー!!!!

Ruby って Perl よりはとっつきやすいね!!

初めての Ruby 長くなったので次

Class って動的?

JavaScript のプロトタイプみたいなもの?いやー。違うか。やってみよう!

class Human
    def initialize(name)
        @name = name
    end
    def say_name
        p @name
    end
end

class Programmer < Human
    def initialize(name, lang)
        super(name)
        @lang = lang
    end
    def develop
        p @lang + ' hooooo!'
    end
end

amachang = Programmer.new('amachang', 'javascript'.gsub(/javascript/, 'ruby'));
amachang.say_name
amachang.develop

class Human
    def say_name
        p @name + ' hoooo!'
    end
end

amachang.say_name
amachang.develop

動的にメソッドの追加などが出来るみたい。

attr_accessor ってのがある。。そののしくみ!知りたい!

知りたい!・・・検索中

class Human
    module_eval(<<-EOF)
        def #{:initialize}
            p 'happy birth time!'
        end
    EOF
end
Human.new
"happy birth time!"

・・・・できた!でも、意味不明・・・。#{} の意味と、module_eval の意味がわからん!でも、class Human というブロックは特殊なブロックではあるけど、定義だけじゃなくて何か実行させることもできそうだ。perl のパッケージだ!なるほど!

class Package
    @@name = 'amachang'
    p 'hello ' + @@name
end
"hello amachang"

なるほどなるほど!

class Package
    def hello(name)
        p 'hello ' + name
    end
    Package::hello('amachang')
    def hello(name)
        p 'hello ! hello ! ' + name
    end
    Package::hello('amachang')
end
-:5: undefined method `hello' for Package:Class (NoMethodError)

・・・・これはダメぽ(´・ω・`)

module_eval って何さ!

文字列をソースに展開するってこと?

class Human
    method_name =  'say'
    module_eval(<<-EOF)
        def #{method_name}_hello
            p 'hello'
        end;
    EOF
end
Human.new.say_hello
"hello"

なるほどー。#{hoge} で変数展開ね。

初めての Ruby

クラスを作ってみた!

おお!typo もしなかったし、ヨサゲだ:)
initialize はなくていいらしい

class Human
end
amachang = Human.new
p amachang
#<Human:0x100f69d8>

コンストラクタ!

なんなくオッケー!

class Human
    def initialize
        p 'ogya-!(ubugoe)'
    end
end
amachang = Human.new
"ogya-!(ubugoe)"

プロパティ!(フィールド?)Ruby ではなんていうの?(後記:インスタンス変数という)

でも、どうやってインスタンスの外からインスタンス変数にアクセスするんだろう??

class Human
    def initialize(name)
        @name = name;
    end
    def say_name
        p @name
    end
end
amachang = Human.new('amachang')
amachang.say_name
"amachang"

こうすると?・・・・nilなんだ!

class Human
    def initialize(name)
        @name = name;
    end
    def say_name
        p @name
    end
end
amachang = Human.allocate
amachang.say_name
nil

うーん。まだまだ気になる点が・・・

仮引数と実引数が合わない場合は?・・・・エラー!?まじですか

class Human
    def initialize(name)
        @name = name;
    end
    def say_name
        p @name
    end
end
amachang = Human.new
amachang.say_name
-:9:in `initialize': wrong number of arguments (0 for 1) (ArgumentError)
        from -:9

こうするのか・・・でも、なんで else には then がないんだ!?

class Human
    def initialize(*name)
        if(name[0]) then
            @name = name[0];
        else
            @name = 'no name'
        end
    end
    def say_name
        p @name
    end
end
amachang = Human.new
amachang.say_name
"no name"