[ruby-list:47201] Re: 今 def 文を実行すると、メソッドが定義されるクラス、にアクセスする方法

From: Nobuhiro IMAI <nov@...>
Date: 2010-07-01 17:28:50 UTC
List: ruby-list #47201
いまいです。

From: "KISHIMOTO, Makoto" <ksmakoto_at_dd.iij4u.or.jp>
Date: Thu, 1 Jul 2010 18:43:13 +0900

> きしもとです
> 
> obj = Object.new
> obj.instance_eval {
> 	def foo; end
> }
> 
> のようなコードを実行すると、特異メソッドが定義されますが、このような、
> 「この文脈で def するとメソッドが定義されるクラス」(この例の場合
> inspect が #<Class:#<Object:0x00000801182d70>> のように
> なるような特異クラス)に簡単にアクセスする式はないのでしょうか?
> 
> 以下のコードの、
> 
> class Foo
> 	# A
> 	def foo
> 		# B
> 		class << self
> 			# C
> 		end
> 	end
> end
> 
> A とか B の場所に書くと Foo に、C に書くと特異クラスになる式がないか、
> というわけです。

A と B は同じにならない気がするので何が正解かよく理解できてないのですが、
self そのもの、もしくは Kernel#singleton_class だったりするでしょうか?

RUBY_DESCRIPTION # => "ruby 1.9.3dev (2010-07-01 trunk 28517) [i686-linux]"
obj = Object.new
obj.instance_eval {
  self            # => #<Object:0x8877834>
  singleton_class # => #<Class:#<Object:0x8877834>>
  def foo; end
}

class Foo
  self            # => Foo
  singleton_class # => #<Class:Foo>
  def foo
    self            # => #<Foo:0x8877078>
    singleton_class # => #<Class:#<Foo:0x8877078>>
    class << self
      self            # => #<Class:#<Foo:0x8877078>>
      singleton_class # => #<Class:#<Class:#<Foo:0x8877078>>>
    end
  end
end

Foo.new.foo

外してたらごめんなさい。
--
Nobuhiro IMAI <nov@yo.rim.or.jp>
Key fingerprint = F39E D552 545D 7C64 D690  F644 5A15 746C BD8E 7106

In This Thread