JPA'daki dizelerle eşlenen scalada bir numaralandırma var. Daha rahat bir kodlama için, aralarındaki örtülü dönüşümleri tanımladım. Bu yüzden şimdi val person.role = "User"
değerini tanımlayabilirim, - person.role
numaralandırma Numaralı bir dizedir, bu yüzden dönüşüm var. Ama bu ikisini karşılaştırmaya çalıştığımda, her zaman yanlış olurum, çünkü def equals (arg0: Any) : Boolean
Any
alır, böylece herhangi bir dönüşüm tetiklenmez. Açık bir dönüşüme ihtiyacım var, ama planım bunu göz ardı etmekti, sizce en iyi uygulama hangisidir? En nezih çözüm burada mı?Dize ve Numaralandırmayı Karşılaştırma
cevap
Enumeration
numaralı Value("User")
, Val
türüdür. Ve inanıyorum ki, equals
'un uygulanması, değerin dize adını karşılaştırmıyor. Bunu yapmanın ağır bir yolunun kendi adı Enumeration
ve Val
'u oluşturmasıdır, böylece ad eşleştiğinde doğru olarak döner.
Ancak, kodumda JPA ile değil, her zaman dizeyi MyEnumeration.Value
'a dönüştürüyorum. Bir istisna olsun dize numaralandırma herhangi bir isim aynı değilse, withName
kullanırken o
object E extends Enumeration { val User = Value("User") }
scala> val a = E.withName("User")
a: E.Value = User
Not: Bu gibi şeyler ile çok kolay.
Sonra hep karşılaştırmalarınızda numaralandırma alanlarını kullanın:
scala> a == E.User
res9: Boolean = true
JPA sadece bir dize döndürürse ve çevresinde hiçbir yolu yoktur. Öyleyse en iyi seçeneğin değeri string'e dönüştürmek ve dizgeyi dizge ile eşleştirmek ya da dizeyi Val değerine yükseltmek ve Val'i karşılaştırmak olduğunu düşünüyorum. equals
yöntemine bir çeşit uzantı uygulamadığınız sürece bu türlerin karıştırılması karşılaştırma için çalışmaz ve bu zor bir işlemdir. Eğer daha uygun olabilir desen eşleme özelliğini kullanarak dalına karşılaştırma kullanıyorsanız, Thomas'ın Yanıta genişletilmesi
:
object Role extends Enumeration {
val User = MyValue("User")
val Admin = MyValue("Admin")
def MyValue(name: String): Value with Matching =
new Val(nextId, name) with Matching
// enables matching against all Role.Values
def unapply(s: String): Option[Value] =
values.find(s == _.toString)
trait Matching {
// enables matching against a particular Role.Value
def unapply(s: String): Boolean =
(s == toString)
}
}
Daha sonra bu kullanabilirsiniz şöyle:
def allowAccess(role: String): Boolean = role match {
case Role.Admin() => true
case Role.User() => false
case _ => throw ...
}
veya
// str is a String
str match {
case Role(role) => // role is a Role.Value
case Realm(realm) => // realm is a Realm.Value
...
}
- 1. Özel dize karşılaştırma C#
- 2. Dize Karşılaştırma Sorununda JavaScript
- 3. Dize karşılaştırma çalışmıyor
- 4. JMeter Beanshell dize karşılaştırma sorunu
- 5. Mermileri ve Numaralandırmayı Not Defteri'nde nasıl kullanabilirim ++?
- 6. Numaralandırmayı bir Kümeye/Listeye Dönüştür
- 7. Dize Listeyle Karşılaştırma <Object> ArrayList?
- 8. Redis ile karşılaştırma gibi dize nasıl yapılır?
- 9. gruplama, karşılaştırma ve r
- 10. Nesneleri karşılaştırma
- 11. Bash, bir karşılaştırma yapmak ve değişkene atama
- 12. NSDictionary için bir blok numaralandırmayı durdurma
- 13. dönen sayısal alanına karşı dize karşılaştırma beklenmedik sonuçlar
- 14. Karşılaştırma yöntemi bile boş
- 15. Karşılaştırma ActionBarSherlock
- 16. ilişki/karşılaştırma?
- 17. Karşılaştırma operatörleri
- 18. YCSB Karşılaştırma
- 19. Dize [] ve [dize] arasındaki fark
- 20. Dize oluşturucu ve dize birleştirme
- 21. Karşılaştırma UIImage
- 22. NSDates'i Karşılaştırma
- 23. Karşılaştırma JAX-RS ve Yay Germe Hizmetleri
- 24. Sayma ve Karşılaştırma satırları Query Mysql PHP
- 25. MySQL kendisine tabloyu birleştirme ve karşılaştırma sonuçları
- 26. Dosya Al Son Değiştirme Zamanı ve Karşılaştırma
- 27. Python ve Smalltalk - Meta programlayabilme yetenekleri karşılaştırma
- 28. Python'da karşılaştırma ve 'değilse' nasıl kullanılır?
- 29. uboot'ta "if" ve karşılaştırma ifadesi nasıl yapılır?
- 30. Tek ve hatta sayı karşılaştırma yardımcı Gidon
Bu eşlemeyi 'Numaralandırma' ve 'Değer' üzerine mi yüklüyorsunuz? – Thomas
@Thomas evet Ben scala'nın scala.Enumeration' ve 'scala kullanıyorum.Yazılım.Value' – coubeatczech
Karşılaştırma için bağlam/kullanım durumu nedir? Desen eşleştirmesi daha iyi bir çözüm sağlayabilir, ancak gerçekten başarmaya çalıştığınız şeye bağlıdır. –