İlk olarak, küçük bir tanım: tekil yöntem , yalnızca tek bir nesne için tanımlanan bir yöntemdir. Misal:
irb(main):001:0> class Foo; def method1; puts 1; end; end
=> nil
irb(main):002:0> foo = Foo.new
=> #<Foo:0xb79fa724>
irb(main):003:0> def foo.method2; puts 2; end
=> nil
irb(main):004:0> foo.method1
1
=> nil
irb(main):005:0> foo.method2
2
=> nil
irb(main):006:0> other_foo = Foo.new
=> #<Foo:0xb79f0ef4>
irb(main):007:0> other_foo.method1
1
=> nil
irb(main):008:0> other_foo.method2
NoMethodError: undefined method `method2' for #<Foo:0xb79f0ef4>
from (irb):8
Örnek yöntemler, bir sınıfın yöntemleridir (yani, sınıfın tanımında tanımlanmıştır). Sınıf yöntemleri, Class
bir sınıf örneğindeki tek yöntemlerdir - sınıfın tanımında tanımlanmamıştır. Bunun yerine, nesnenin tekil sınıfında tanımlanırlar .
irb(main):009:0> Foo.method_defined? :method1
=> true
irb(main):010:0> Foo.method_defined? :method2
=> false
Sözdizimi ile bir nesnenin singleton sınıfını açarsınız class << obj
. Burada, bu singleton sınıfının singleton yöntemlerinin tanımlandığı yer olduğunu görüyoruz:
irb(main):012:0> singleton_class = ( class << foo; self; end )
=> #<Class:#<Foo:0xb79fa724>>
irb(main):013:0> singleton_class.method_defined? :method1
=> true
irb(main):014:0> singleton_class.method_defined? :method2
=> true
irb(main):015:0> other_singleton_class = ( class << other_foo; self; end )
=> #<Class:#<Foo:0xb79f0ef4>>
irb(main):016:0> other_singleton_class.method_defined? :method1
=> true
irb(main):017:0> other_singleton_class.method_defined? :method2
=> false
Dolayısıyla, bir nesneye tekil yöntemler eklemenin alternatif bir yolu, onları nesnenin tekil sınıfı açık olarak tanımlamak olacaktır:
irb(main):018:0> class << foo; def method3; puts 3; end; end
=> nil
irb(main):019:0> foo.method3
3
=> nil
irb(main):022:0> Foo.method_defined? :method3
=> false
Özetle:
- yöntemler her zaman bir sınıfa ait olmalıdır (veya: bazı sınıfların örnek yöntemleri olmalıdır)
- normal yöntemler tanımlandıkları sınıfa aittir (yani, sınıfın örnek yöntemleridir)
- sınıf yöntemleri, yalnızca bir
Class
- Bir nesnenin tekil yöntemleri, nesne sınıfının örnek yöntemleri değildir; daha ziyade, nesnenin singleton sınıfının örnek yöntemleridir.