Enumerable'u düşünün.
Bu, bir modülde ne zaman eklemeniz gerektiğine dair mükemmel bir örnektir. Sınıfınız #each
'u tanımlarsa, bir modül ekleyerek (#map
, #select
, vb.) Çok fazla iyilik elde edersiniz. Modülleri miks olarak kullandığım tek durum budur - modül, modülde dahil ettiğiniz sınıfta tanımlanan birkaç yöntem açısından işlevsellik sağlar. Bunun genel olarak tek durum olması gerektiğini söyleyebilirim. "Statik" yöntemleri tanımlayan gelince
, daha iyi bir yaklaşım olacaktır:
module MyModule
def self.do_something
end
end
Gerçekten #module_function
aramaya gerek yoktur. Bence sadece tuhaf eski şeyler.
module MyModule
extend self
def do_something
end
end
... ama aynı zamanda bir yere modülü dahil etmek istiyorsanız iyi çalışmaz:
Hatta yapabilirsiniz. Ruby meta programlamasının inceliklerini öğrenene kadar bundan kaçınmanızı öneriyorum.
Son olarak, sadece yaparsanız:
def do_something
end
... küresel bir fonksiyonu olarak sona olmayacak, ama
Object
özel bir yöntem olarak (hayır fonksiyonlar, Ruby sadece yöntem vardır). İki olumsuz taraf var. İlk olarak, ad boşluğuna sahip değilsiniz - aynı ada sahip başka bir işlev tanımlarsanız, daha sonra değerlendirdiğiniz kişi budur. İkincisi,
#method_missing
açısından uygulanan bir işlevselliğe sahipseniz,
Object
'da özel bir yönteme sahip olmak onu gölgeleyecektir. Ve son olarak,
Object
yama maymunvari kötü iş :) olduğunu
DÜZENLEME:
module_function
private
benzer bir şekilde kullanılabilir:
module Something
def foo
puts 'foo'
end
module_function
def bar
puts 'bar'
end
end
Bu şekilde, Something.bar
çağırabilir, ancak Something.foo
değil. Bu çağrıdan sonra module_function
'a başka herhangi bir yöntem tanımlarsanız, bunlar karıştırılmadan da kullanılabilirlerdi.
İki nedenden dolayı beğenmiyorum.İlk olarak, hem karışık hem de "statik" yöntemlere sahip olan modüller biraz tehlikeli geliyor. Geçerli davalar olabilir, ama o kadar sık olmayacak. Dediğim gibi, bir modülü bir ad alanı olarak kullanmayı veya karıştırmayı tercih ediyorum, ancak ikisini de değil. Bu örnekte bar
,İkinci olarak, bu örnekte Something
'da bulunan sınıflar/modüller için kullanılabilir. Yöntemin, self
'u kullandığı ve karıştırılmasının gerekip gerekmediği ve karıştırılmasının gerekmediğinden emin olamadığımdan emin değilim.
module_function
'u kullanmadan kullanmayı düşünüyorum. Yöntemin adı ile çok daha sık kullanılır. Aynı şey private
ve protected
için geçerlidir.
Açıklama için teşekkürler. Neden bir modülde karıştırmak istediğinizi anlıyorum, bu soru modül_fonksiyonunu gerçekte ne zaman kullanabileceğinizi sorguluyordu. Gerçekten kullanabileceğin zaman var mı? –
Bu son örnekte 'module_function' ile bir daha yakalama daha var:" foo "nun" private "işlevi" bar "içinden erişilemiyor, çünkü" foo "o zaman bir örnek metodu ('self' içermiyor) ve sadece bu modül bir sınıfta karıştırıldığında çağrılabilir. Sadece isim verme amaçları için bağımsız bir modül olduğunda imkansız. Peki ikisine nasıl sahip olunur? Modül sadece ad-boşluk kullanımı ve bazı uygulama yardımcı işlevlerini dış dünyadan gizlemek için kullanılır, ancak bunların arabirim yöntemleriyle çağrılmasına izin verir misiniz? – SasQ