SORU
24 Mart 2010, ÇARŞAMBA


sınıf << Ruby kendini deyim

class << self Ruby ne yapar?

CEVAP
24 Mart 2010, ÇARŞAMBA


İlk olarak, class << foo sözdizimi açılıyor foo'In singleton sınıfı (eigenclass). Bu yöntem, belirli bir nesne denilen davranışı uzmanlaşma olanağı sağlar.

a = 'foo'
class << a
  def inspect
    '"bar"'
  end
end
a.inspect   # => "bar"

a = 'foo'   # new object, new singleton class
a.inspect   # => "foo"

Şimdi, soruma cevap ver: class << self açılır self'In tek sınıf, yöntemleri olabilir yeniden için geçerli self nesne (hangi içinde bir sınıf veya modülü gövde sınıf veya modülükendisi). Genellikle, bu sınıf/modül tanımlamak için kullanılır ("") statik yöntemler:

class String
  class << self
    def value_of obj
      obj.to_s
    end
  end
end

String.value_of 42   # => "42"

Bu da bir kısaltma olarak yazılabilir:

class String
  def self.value_of obj
    obj.to_s
  end
end

Hatta daha kısa

def String.value_of obj
  obj.to_s
end

İçinde bir işlev tanımı, self nesne anlamına gelir zaman fonksiyonu denir. Bu durumda, class << self bu nesnenin singleton sınıfı açılır; o birini kullanın zavallı bir adamın durumu makine uygulamak için:

class StateMachineExample
  def process obj
    process_hook obj
  end

private
  def process_state_1 obj
    # ...
    class << self
      alias process_hook process_state_2
    end
  end

  def process_state_2 obj
    # ...
    class << self
      alias process_hook process_state_1
    end
  end

  # Set up initial state
  alias process_hook process_state_1
end

Yani, yukarıdaki örnekte, her örnek StateMachineExample process_hook takma ad process_state_1 ama unutmayın ne kadar yıl geçtikten sonra, yeniden process_hook (self sadece, değil etkileyen diğer StateMachineExample örnekleri) process_state_2. Bu yüzden, her zaman bir arayan process yöntemi redefinable process_hook çağırır), davranış değişiklikleri ne bağlı olarak çağırır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • André Frizzo

    André Frizz

    16 Aralık 2006
  • Joe DiFeo

    Joe DiFeo

    7 AĞUSTOS 2012
  • magnum33563

    magnum33563

    8 NİSAN 2011