Bir yöntemi yeniden tanımlamak istiyorum, ancak bununla ilişkili uyarılardan kaçının. Undef_method veya remove_method kullanmalı mıyım? undef_method ne zaman kullanılır ve remove_method ne zaman kullanılır?
(Evet, yöntemler yeniden tanımlanması Ben birim testler çalışmasını olup kullanmak istediğiniz bazı Memoization var çünkü ben yapıyorum. Biraz hacky ama programın kendisi çalıştırılır değilken.)cevap
fine manual Gönderen: kendine →
undef_method (sembol)
adlı yönteme çağrılarına yanıt güncel sınıfını önler. Yöntemi, belirli bir sınıftan silen,
remove_method
ile karşılaştırın; Ruby, olası bir alıcı için üst sınıf ve karışık modda arama yapmaya devam edecektir.
Yani bir böyle remove_method
: def m
sınıfa yöntemi m
ekleyen
class CC < C
def m
end
end
, remove_method :m
m
kaldırır:
class CC < C
remove_method :m
end
esasen bunun tersidir. Ancak, süper sınıf bir m
yöntemine sahipse, bu hala kullanılmaya devam edecektir. Eğer böyle hitap çalışırsanız şikayet Yani undef_method
aslında yöntemini kaldırmaz, bu Ruby neden olan özel bir iç bayrağıyla yöntemini değiştirir
class CC < C
def m
raise 'No, you cannot do that.'
end
end
:
undef_method
semantik yüzden remove_method
muhtemelen daha uygundur eklemek bir ardından kaldırmak aynıdır geliyor. Bununla birlikte, paranoyak olmak ve değiştirme yönteminin yerinde olduğundan emin olmak istiyorsanız, undef_method
yararlı olacaktır; ya da, eğer bir sebepten dolayı yöntemi tek bir yerde kaldırmanız ve diğerine eklemeniz gerekirse, undef_method
en azından işin sadece yarısını yaptığınızı söylerse, remove_method
sizi süper sınıfın uygulamasıyla (ve olası garip böceklerle)) veya oldukça kafa karıştırıcı bir NoMethodError
.
Bir yöntemi iki kolay şekilde kaldırabilirsiniz. Devralınan olanlar da dahil olmak üzere tüm yöntemleri kaldırır. . nazik
Module#remove_method()
alıcıdan yöntemi kaldırır, fakat tek başına yöntemleri kalıtsal bırakır.# Için ': undefined method
x'(NoMethodError)
class A
def x
puts "x from A class"
end
end
class B < A
def x
puts "x from B Class"
end
undef_method :x
end
obj = B.new
obj.x
sonuç undef_method kullanılarak
Örnek 1 -
2'nin altında basit örneğe bakın
Örnek 2 using_method
class A
def x
puts "x from A class"
end
end
class B < A
def x
puts "x from B Class"
end
remove_method :x
end
obj = B.new
obj.x
Sonucu - $ yakut A sınıfından
- 1. Gen_Fsm ne zaman kullanılır ve Gen_Server ne zaman kullanılır?
- 2. Vektörler ne zaman kullanılır ve C++ dizini ne zaman kullanılır?
- 3. Parallel.For ne zaman kullanılır?
- 4. 'java.util.Objects. *' Ne zaman kullanılır?
- 5. recyclerView.setHasFixedSize ne zaman kullanılır?
- 6. StringIO ne zaman kullanılır?
- 7. Ne zaman kullanılmalı ve Aurelia'da ne zaman kullanılır?
- 8. Julia'nın dönüşümü ne zaman kullanılır?
- 9. Fabrika kalıpları ne zaman kullanılır?
- 10. Bir initform ne zaman kullanılır?
- 11. Ne zaman React createFragment kullanılır?
- 12. İyon bölmesi ne zaman kullanılır?
- 13. RxAndroid: bindActivity ne zaman kullanılır ve neden?
- 14. SLEEP(), MySQL'de nasıl ve ne zaman kullanılır?
- 15. Caddr_t'nin önemi nedir ve ne zaman kullanılır?
- 16. @Embedded ve @Embeddable ne zaman kullanılır?
- 17. Silverlight'ta UserControl vs Control ne zaman kullanılır?
- 18. Android uygulamasında Dagger ne zaman kullanılır?
- 19. Caffe'de yerinde katmanlar ne zaman kullanılır?
- 20. <!--[if !IE]> ne zaman kullanılır?
- 21. IsRoot, UML'de IsAbstract & IsLeaf ne zaman kullanılır?
- 22. Ne zaman Kullanılır? Vs. Karşılaştırma Clojure
- 23. BackgroundWorker'ı veya Konuları yönetme ne zaman kullanılır?
- 24. JavaScript şablon motorları ne zaman kullanılır?
- 25. Yay ne zaman kullanılır: url etiketi?
- 26. Objective-C 'kendini' ne zaman kullanılır
- 27. jstl içinde requestScope ne zaman kullanılır?
- 28. Uzay gemisi operatörü ne zaman kullanılır?
- 29. InsertAllOnSubmit <TSubEntity> ne zaman kullanılır?
- 30. SML'de noktalı virgül ne zaman kullanılır?
Müthiş Açıklamalar gelen
x main.rb. –