初めての 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} で変数展開ね。