Created
November 28, 2012 23:18
-
-
Save maeharin/4165469 to your computer and use it in GitHub Desktop.
Ruby_ソースコードリーディングの武器
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 前提 | |
# Ruby 1.9.2 | |
### | |
# ソース探索 | |
# 現在地のクラスと呼び出し元プログラムを表示 | |
p "#{Module.nesting.first} #{caller.first}" | |
# メソッドが定義されている場所を探索 | |
# method(:メソッド名).source_location | |
# Ruby1.9.2以上 | |
class C | |
def foo; end | |
end | |
obj = C.new | |
p obj.method(:foo).source_location | |
# メソッドのレシーバを確認 | |
p self | |
# オブジェクトのインスタンス変数を取得 | |
class C | |
def initialize | |
@v = 'hoge' | |
end | |
def foo2 | |
p self.instance_variable_get(:@v) | |
end | |
end | |
c = C.new | |
c.foo2 #"hoge" | |
# クラスの継承関係を可視化 | |
# ancestors | |
class C1; end | |
class C2 < C1; end | |
p C2.ancestors | |
# クラスのメソッド、インスタンスメソッド。オブジェクトのメソッドを表示 | |
class C | |
def self.foo1; end | |
def foo2; end | |
end | |
c = C.new | |
p C.methods #:foo1が含まれる | |
p C.instance_methods #:foo2が含まれる | |
p c.methods #:foo2が含まれる | |
p c.instance_methods #error | |
### | |
# イディオム | |
# 一瞬名にやってるかわからない不思議なイディオムがある。メタプログラミングRubyより抜粋 | |
# nilガード | |
a ||= [] | |
# ミミックメソッド | |
def foo=(*args) | |
p args | |
end | |
# ミミックメソッド2 | |
class C | |
def []=(*args) | |
p args | |
end | |
end | |
c = C.new | |
c['hoge'] = 'fuge' # ["hoge", "fuge"] | |
c.['hoge'] = 'fuge' # syntax error | |
### | |
# クラス | |
# クラスとモジュール定義の部分(メソッド定義以外の部分)は、即実行される | |
class C | |
puts 'hoge' #読み込まれた時点で即実行される | |
def foo | |
puts 'fuge' #読み込まれた時点では実行されない。メソッドfooが呼び出されて初めて実行される | |
end | |
end | |
# self | |
# - 通常は、呼び出したメソッドのレシーバがselfになる | |
# - クラスとモジュールの定義内(かつメソッド定義の外)では、クラス・モジュール自身がselfになる | |
class C | |
p self #C | |
def foo | |
p self #このメソッドを呼び出したレシーバ | |
end | |
def self.foo | |
p self #C | |
end | |
end | |
# メソッド探索 | |
module M1 | |
def foo | |
p self | |
puts '1' | |
end | |
end | |
module M2 | |
def foo | |
p self | |
puts '2' | |
# foo #無限ループ | |
end | |
end | |
class C1 | |
def foo | |
p self | |
puts '3' | |
end | |
end | |
class C2 < C1 | |
include M1 | |
include M2 | |
end | |
c = C2.new | |
c.foo | |
# オープンクラス | |
# ActiveSupportなどで、標準クラスの拡張がガシガシ行われている | |
### | |
# モジュール | |
# モジュール名は定数。相対参照と絶対参照で参照できる | |
module M | |
def self.foo; puts '1段目'; end | |
module M | |
def self.foo; puts '2段目'; end | |
end | |
M.foo # 2段目 相対 | |
::M.foo # 1段目 絶対 | |
end | |
M.foo # 1段目 相対 | |
::M.foo # 1段目 絶対 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment