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