Skip to content

Instantly share code, notes, and snippets.

@maeharin
Created November 28, 2012 23:18
Show Gist options
  • Save maeharin/4165469 to your computer and use it in GitHub Desktop.
Save maeharin/4165469 to your computer and use it in GitHub Desktop.
Ruby_ソースコードリーディングの武器
# 前提 
# Ruby 1.9.2
# 現在地のクラスと呼び出し元プログラムを表示
module M
class C
def foo
p "#{Module.nesting.first} #{caller.first}"
end
end
end
c = M::C.new
c.foo
# クラスの継承関係を可視化
# 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
# メソッドが定義されている場所を探索
# 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"
###
# クラス
# クラスとモジュール定義の部分(メソッド定義以外の部分)は、即実行される
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などで、標準クラスの拡張がガシガシ行われている
###
# イディオム
# 一瞬名にやってるかわからない不思議なイディオムがある。メタプログラミング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 Object
define_method(:foo) do
puts 'foo'
end
end
foo
###
# モジュール
# モジュール名は定数。相対参照と絶対参照で参照できる
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