初めてのイテレータ
うわーもう、イテレータとかドキドキしちゃうなーもう。初体験
どんなものよ?ググってみよう!
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 長くなったので次
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"