2012-07-12 36 views
12

Làm cách nào tôi có thể ghi đè "toString" để làm cho mã Scala này hoạt động giống như mã Java sau.Ghi đè phương thức toString trong Liệt kê Scala

Mã trong Scala

object BIT extends Enumeration { 
    type BIT = Value 
    val ZERO, ONE, ANY = Value 

    override def toString() = 
     this match { 
     case ANY => "x " 
     case ZERO=> "0 " 
     case ONE => "1 " 
    } 
} 

val b = ONE 
println(ONE) // returns ONE 

Wanted hành vi toString nên sản xuất cùng một sản lượng như mã Java sau.

public enum BIT { 
    ZERO, ONE, ANY; 

    /** print BIT as 0,1, and X */ 
    public String toString() { 
     switch (this) { 
     case ZERO: 
      return "0 "; 
     case ONE: 
      return "1 "; 
     default://ANY 
      return "X "; 
     } 
    } 
} 

BIT b = ONE; 
System.out.println(b); // returns 1 

Tôi nghĩ rằng tôi đang ghi đè sai phương pháp "toString".

Trả lời

29

Trước tiên, có bạn đang ghi đè phương thức toString sai. Bạn đang ghi đè phương thức trên chính đối tượng BIT, điều này không hữu ích lắm.

Thứ hai, bạn thực hiện điều này dễ dàng hơn nhiều bằng cách đơn giản làm

object BIT extends Enumeration { 
    type BIT = Value 
    val ZERO = Value("0") 
    val ONE = Value("1") 
    val ANY = Value("x") 
} 

Sau đó, bạn có thể làm

println(BIT.ONE) //prints "1" 
1

Nếu bạn muốn thiết lập các giá trị và chuỗi bạn có thể làm điều đó như thế này:

scala> object BIT extends Enumeration { 
    | type BIT = Value 
    | val ZERO = Value(0, "0") 
    | val ONE = Value(1, "1") 
    | val ANY = Value("x") 
    | } 
defined module BIT 

scala> BIT.ZERO.toString 
res2: String = 0 

scala> BIT.ZERO.id 
res3: Int = 0 

scala> BIT.ANY.id 
res4: Int = 2 

scala> BIT.ANY.toString 
res5: String = x 
Các vấn đề liên quan