Làm thế nào để tôi bỏ một biến trong Scala?


199

Đưa ra một biến với loại Graphics, làm thế nào để tôi đưa nó Graphics2Dvào Scala?

Câu trả lời:


282

Kỹ thuật ưa thích là sử dụng khớp mẫu. Điều này cho phép bạn xử lý một cách duyên dáng trong trường hợp giá trị trong câu hỏi không thuộc loại đã cho:

g match {
  case g2: Graphics2D => g2
  case _ => throw new ClassCastException
}

Khối này sao chép ngữ nghĩa của asInstanceOf[Graphics2D]phương thức, nhưng với tính linh hoạt cao hơn. Ví dụ: bạn có thể cung cấp các nhánh khác nhau cho các loại khác nhau, thực hiện hiệu quả nhiều phôi có điều kiện cùng một lúc. Cuối cùng, bạn không thực sự cần phải ném một ngoại lệ trong khu vực bắt tất cả, bạn cũng có thể quay lại null(hoặc tốt nhất là None), hoặc bạn có thể nhập một số chi nhánh dự phòng hoạt động mà không có Graphics2D.

Nói tóm lại, đây thực sự là con đường để đi. Nó hơi cồng kềnh hơn về mặt cú pháp so với asInstanceOf, nhưng tính linh hoạt được thêm vào hầu như luôn luôn xứng đáng.


19
+1 vì nó thú vị, nhưng hơi quá nhiều cho kịch bản này. phải không
Eugene Yokota

Điều gì xảy ra nếu tôi đã ghép mẫu nhưng bị mất tham chiếu đến giá trị được đúc: <code> khớp cơ sở {case MyConcittle (value) => base.asInstanceOf [MyConcittle] .s Something (value)} </ code>, có cách nào để nhận được ' cơ sở 'được truyền tới MyConcittle ngay cả khi muốn trích xuất "giá trị" bằng cách khai thác lệnh gọi' không vui 'được thực hiện bởi "case MyConcittle (value)"?
ithkuil

4
Hãy thử điều này: base match { case base @ MyConcrete(value) => base.something(value) } Rõ ràng, bóng baselà tùy chọn. Bạn có thể dễ dàng sử dụng một tên biến khác nhau.
Daniel Spiewak

Những gì tôi không nhận được là làm thế nào bạn có được kết quả của mô hình khớp này được đúc thành một biến? như trong java nếu đó là Chuỗi a = (Chuỗi) b; Scala tương đương sẽ là gì?
James McMahon

@JamesMcMahonval gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
Kevin Meredith

224
g.asInstanceOf[Graphics2D];

36
Khi tôi đã quen với Scala, tôi đã học cách không sử dụng asInstanceOf, vì nó đánh bại mục đích có hệ thống kiểu tĩnh và cảm thấy xui xẻo.
Eugene Yokota

26
Thật không may, đây là một hoạt động phổ biến khi sử dụng Swing. Đối với các thao tác vẽ tùy chỉnh, bạn cần ghi đè phương thức 'public void paintComponent (Graphics g)'. Tham số Graphics thực sự là một cá thể Graphics2D, nhưng cần có một cast. Các phiên bản phù hợp với mô hình có thể dài hơn so với bảo hành. Hãy nhớ rằng: Sự tăng động và tăng sinh đáng kinh ngạc của eschew!
hohonuuli

7
@hohonuuli Tôi nghĩ rằng dàn diễn viên vẫn ổn trong trường hợp cụ thể đó, nhưng nếu bạn sử dụng scala-swingcác thành phần, tham số của paintComponent đã là Graphics2D nên không yêu cầu diễn viên
Luigi Plinge

2
Sao nó dài thế? Tại sao "asInstanceOf khi chỉ có thể là từ khóa" as "hoặc" asof "? Hoặc tại sao họ không chỉ sử dụng cách C ++ và Java như một tùy chọn vì đó là cách thông thường và không có vấn đề gì lớn với điều đó?
LEMUEL QUẢNG CÁO

16
@LemuelAdane Thực tế là bạn đang sử dụng phôi là một mùi mã, sẽ không có ý nghĩa gì để làm cho chúng dễ dàng hơn.
Daenyth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.