2010-05-05 60 views
5

Tôi có một kiểu liệt kê mà tôi muốn sử dụng trong các đối sánh mẫu trong một diễn viên. Tôi không nhận được những gì tôi mong đợi và, bây giờ, tôi nghi ngờ tôi đang thiếu một cái gì đó đơn giản.Kết hợp Scala/so sánh các số liệt kê

liệt kê My,

object Ops extends Enumeration { 
    val Create = Value("create") 
    val Delete = Value("delete") 
} 

Sau đó, tôi tạo ra một Ops từ một String:

val op = Ops.valueOf("create") 

Bên trong trận đấu của tôi, tôi có:

case (Ops.Create, ...) 

Nhưng Ops.Create doesn dường như không bằng ops.valueOf ("tạo")

Cựu chỉ là một nguyên tử 'create' và sau này là một số (tạo)

Hy vọng rằng, điều này là đủ thông tin cho một ai đó cho tôi biết những gì tôi đang mất tích ...

Cảm ơn

Trả lời

7

Nếu bạn đang cố gắng để có được một bản sao của Create, sau đó bạn nên tham khảo trực tiếp trong mã của bạn:

val op = Ops.Create 

Nhưng nếu bạn đang phân tích nó từ một chuỗi, chuỗi có thể chứa rác, nên valueOf trả về một Option:

val op1 = Ops.valueOf("create") // Some(Ops.Create) 
val op2 = Ops.valueOf("delete") // Some(Ops.Delete) 
val op3 = Ops.valueOf("aljeaw") // None 

Bây giờ, trong trận đấu của bạn, bạn chỉ có thể thực hiện dọc theo Option[Ops.Value] và tìm kiếm:

case(Some(Ops.Create),...) 

và bạn đã tích hợp sẵn tính năng mạnh mẽ để làm đầu vào.

+0

Phản hồi vô cùng hữu ích, cảm ơn Rex! – Tim

+7

Đối với bất kỳ ai đọc điều này trong tương lai, 'Enumeration.valueOf' đã không được dùng nữa: sử dụng' withName' để thay thế –

1

Enumeration.valueOf trả về None hoặc Some, bởi vì bạn có thể yêu cầu tạo một giá trị không tồn tại. Trong trường hợp của bạn, ví dụ: Ops.valueOf("blah") sẽ trả về None, vì bạn không có giá trị điều tra thích hợp.

Thành thật mà nói, trong trường hợp này, tôi muốn sử dụng case class hoặc case object thay vì Enumeration (chúng cung cấp sự an toàn kiểu tốt hơn).

-1

Có vẻ như tôi cần sử dụng phương thức 'get' của Số trả lại để thực sự có được những gì tôi muốn. Ví dụ.

ops.valueOf("create").get == Ops.Create 

Có vẻ không trực quan hay thân thiện nhưng nó hoạt động.

+0

Đó là vì 'Enumeration.valueOf' trả về một đối tượng' Option', có nghĩa là bạn phải sử dụng 'get' để lấy giá trị giá trị. – mipadi

Các vấn đề liên quan