Farz edelim: Yöntem1, işlev2, işlev3. Ben function1 ve function2 almak istiyorum ama function3 değil. Bunu ruby'de yapmanın bir yolu var mı?Bir Ruby modülünden yalnızca birkaç işlevi nasıl alabilirim?
7
A
cevap
6
Sadece istediğiniz yöntemleri eklemek için temiz bir yol olup olmadığından emin değilsiniz, ancak istemediğiniz yöntemleri undef_method
kullanarak kaldırabilirsiniz.
module Foo
def function1
end
def function2
end
def function3
end
end
module MiniFoo
include Foo
not_wanted_methods = Foo.instance_methods - %w(function1 function2)
not_wanted_methods.each {|m| undef_method m}
end
class Whatever
include MiniFoo
end
5
Benzer çözüm ancak biraz daha otomatik. Ne tür garip şeyler olsa da, hiçbir fikrim yok. Eğer modül için kaynak kodunu kontrol varsayarsak
module Foo
def m1
puts "Hello from m1"
end
def m2
puts "Hllo from m2"
end
end
class Module
alias :__include__ :include
def include(mod, *methods)
if methods.size > 0
tmp = mod.dup
new_mod = Object.const_set("Mod#{tmp.object_id}", tmp)
toremove = new_mod.instance_methods.reject { |m| methods.include? m.to_sym }
toremove.each { |m| new_mod.send(:undef_method, m) }
__include__(new_mod)
else
__include__(mod)
end
end
end
class Bar
include Foo
end
class Baz
include Foo, :m2
end
bar = Bar.new
baz = Baz.new
p bar.methods - Object.methods
p baz.methods - Object.methods
=>
["m1", "m2"]
["m2"]
4
, ben en temiz yol daha, ah, modüler parçalara modülü bölmek olacağını düşünüyorum.
Yalnızca bir modülün bazı bölümlerini istiyorsanız, bu modülü daha az sorumluluğu olan çok sayıda modülde yeniden düzenleyebileceğinizi gösteren oldukça iyi bir işarettir.
İlgili konular
- 1. Ruby sınıfının adını nasıl alabilirim?
- 2. Birkaç paragraf içeriyor window.Open() işlevi
- 3. Yalnızca Listedeki konumlardan yalnızca girişleri nasıl alabilirim?
- 4. Bir Fsharp modülünden bir Python komut dosyasını nasıl çalıştırabilirsiniz?
- 5. Python'da yalnızca cwd'nin alt klasörlerini nasıl alabilirim
- 6. Rails rotasında yalnızca sorgu dizesini nasıl alabilirim?
- 7. Linux'ta bir dosya için yalnızca bir inode numarasını nasıl alabilirim?
- 8. Posta() işlevi için hata iletisini nasıl alabilirim?
- 9. Bu Ruby işlevi ne yapıyor?
- 10. birkaç ad alanlarında aşırı bir işlevi çağırmak bir ad
- 11. Birkaç kullanıcı için Mercurial deposunu nasıl kendim alabilirim?
- 12. Ruby regexp'deki satırın yalnızca başlangıcı
- 13. Bu işlevi çağırmak için nasıl bir işlev alabilirim?
- 14. Scala sarıcı yöntemim için herhangi bir işlevi nasıl alabilirim?
- 15. Bir çekirdek modülünden bir kullanıcı programı Killing
- 16. Lodash _.filter işlevi yalnızca ONE koşulunu karşılamalıdır
- 17. Tensorflow'da yalnızca Python ile özel bir aktivasyon işlevi nasıl oluşturulur?
- 18. SecurityException: eCall yöntemleri I aşağıdakine benzer bir (C#) işlevi vardır bir sistem modülünden
- 19. Bir eklenti modülünden dll.config (app.config!) Okuma
- 20. Ruby'de bir döngüde birkaç yinelemeyi nasıl atlayabilirsiniz?
- 21. Yalnızca halka üzerinde yineleyin Açık Ruby sabitleri
- 22. RSpec'in Ruby Test :: Unit'deki davranış gibi paylaşılan örneklerini nasıl alabilirim?
- 23. jQuery'ye yalnızca belirli bir web sayfasında bir işlevi çalıştırmasını söylerim?
- 24. Ruby
- 25. Google Fit API’dan yalnızca aktif kalorileri nasıl alabilirim?
- 26. Python ile Azure İşlevi Başlattıran inputBlob Adını Nasıl Alabilirim
- 27. Python isnumeric işlevi yalnızca unicode üzerinde çalışır
- 28. vim işlevi yalnızca ilk kez düzgün çalışıyor
- 29. Excel'den yalnızca birkaç satır ekledikten sonra taşma hatası
- 30. Bir özelliği birkaç TFS oluşturma komut dosyası arasında nasıl paylaşırım?
Böyle bir şeyi aklıma aldım, ama belki daha temiz bir yol olduğunu düşündüm. – Geo