メタプログラミングRuby 一日目を読んだ
まとめを抜粋
- オブジェクトは複数のインスタンス変数とクラスへのリンクで構成されている.
- オブジェクトのメソッドはオブジェクトのクラスに住んでいる(クラスから見れば,それはインスタンスメソッドと呼ばれる)
- クラスはClass クラスのオブジェクトである.クラス名は単なる定数である.
- Class はModule のサブクラスである.モジュールはメソッドを集めたものである.クラスはnew() でインスタンス化したり,superclass()で階層構造を作ったりできる.
- 定数はファイルシステムのようにツリー上に配置されている.モジュールやクラスの名前がディレクトリ,通常の定数がファイルのようになっている
- クラスはそれぞれBasicObject まで続く継承チェーンを持っている.
- メソッドを呼び出すと,Ruby はレシーバのクラスに向かって一歩右へ進み,それから継承チェーンを上へ向かって進んでいく.メソッドを発見するか継承チェーンが終わるまでそれは続く.
- クラスがモジュールをインクルードすると,そのクラスの真上の継承チェーンにモジュールが挿入される.
- メソッドを呼び出すとき,レシーバが self になる.
- モジュール(あるいはクラス)を定義するとき,モジュールが self になる.
- インスタンス変数は常に self のインスタンス変数とみなされる.
- レシーバを明示的に指定せずにメソッドを呼び出すと,self のメソッドだとみなされる.
#!/usr/bin/env perl6 # -*- mode: perl; coding: utf-8-unix; -*- use v6; class MyClass { has $!v; method my_method { } } my $obj = MyClass.new say MyClass.WHAT; #=> MyClass() say $obj.^parents.perl; # => (Any, Mu) say $obj.^methods(:local).map({.name}).perl; #=> ("my_method")
メソッドサーチ,継承関係について,もうちょっと調べる必要があるな.
- REPL 便利
- .perl が inject 的に使える.p 的なものもある?
- ^XXXX と HOW.XXXX を使う
- class base と prototype base の両方が使える
メタプログラミングRuby
posted with amazlet at 11.02.14