2012-01-08 27 views
14

Giả sử tôi đang cố gắng viết một trò chơi Tic-Tac-Toe đơn giản. Nó có một trường M x N. Trò chơi chỉ có một trường, vì vậy nó có thể được biểu diễn bằng một singleton object. Như thế này:Làm cách nào để khởi tạo các vals đối tượng với các giá trị chỉ được biết khi chạy?

object Field { 
    val height : Int = 20 
    val width : Int = 15 
    ... 
} 

Nhưng tôi không muốn mã hóa chiều cao và chiều rộng, vì vậy sẽ tốt nếu chúng có thể được truyền cho đối tượng trong thời gian chạy, thông qua hàm tạo hoặc thứ gì đó. Nhưng object s không thể có nhà thầu.

Vâng, tôi có thể thay đổi heightwidthvar s, và không val s và giới thiệu một phương pháp mới

def reconfigure (h:Int, w:Int) = { 
    height = h 
    width = w 
} 

và gọi nó vào lúc bắt đầu của trò chơi. Nhưng nó cũng không tao nhã.

Vì vậy, có cách nào gọn gàng để thực hiện việc này - tức là có đối tượng được khởi tạo val s với các giá trị không được biết trước khi chạy không?

+0

Dường như mọi giải pháp sẽ yêu cầu 'var' ở đâu đó. Bạn đã xem xét làm cho 'Field' một lớp với các tham số hàm tạo chiều cao và chiều rộng? –

+0

@KiptonBarros tôi đã làm. Nhưng tôi chỉ cần một ví dụ duy nhất của lớp đó. Vì vậy, tôi nghĩ rằng nó sẽ được _ideologically_ tốt hơn để sử dụng 'đối tượng'. –

Trả lời

15

Tại sao không sử dụng class và khởi tạo một trường hợp trong main?

case class Field(width: Int, height: Int) { 
    //... 
} 

object Main { 
    def main(args: Array[String]): Unit = { 
    val field = Field(30, 25) 
    } 
} 
+0

Vì nó không thanh lịch. 'object' phải được giới thiệu trong Scala vì một lý do. Hoặc người nào khác, tại sao mọi người sẽ sử dụng đồ vật? –

+5

@Saptamus Chỉ vì mẫu đơn được gọi là mẫu thiết kế không có nghĩa là nó thanh lịch và bạn nên sử dụng nó. Tôi đang sử dụng các đối tượng và tôi sẽ không sử dụng chúng cho trường hợp sử dụng của bạn. – ziggystar

+3

Sử dụng lớp học chắc chắn là cách để đi. @SaptamusPrime Không chắc tại sao bạn nói nó không thanh lịch. Tình huống bạn mô tả là một trường hợp sử dụng tiêu chuẩn trong kiến ​​trúc OO. Bạn đang cố gắng sử dụng Object trong một tình huống mà nó không phù hợp. Các đối tượng có nghĩa là được sử dụng làm đồng hành cho một lớp, để giữ các công cụ phổ biến cho tất cả các cá thể như phần tĩnh của một lớp trong Java. Đó là lý do tại sao chúng được gọi là "đối tượng đồng hành". –

5

Một lựa chọn là Vals lười biếng:

object Field { 
    lazy val height = // code to find height 
    lazy val width = // code to find width 
} 

Các val sẽ được khởi tạo lần đầu tiên nó được sử dụng, do đó, miễn là bạn không sử dụng chúng cho đến khi bạn có tất cả các thông tin cần thiết để khởi họ, bạn nên tốt.

+1

nhưng điều đó vẫn không cung cấp cách để đặt trường này từ bên ngoài –

+0

Câu trả lời này là crap ... Các đối tượng được khởi tạo lười biếng anyway – lisak

13

Bạn có thể sử dụng các trò chơi lười biếng. Điều này có thể làm cho mọi thứ trở nên phức tạp hơn nếu bạn vẫn cần sử dụng var.

case class Config(height: Int, width: Int) 
object Field { 
    val defaultConfig = Config(20, 15) 
    var config: Option[Config] = None 
    def getConfig = config.getOrElse(defaultConfig) 
    lazy val height = getConfig.height 
    lazy val width = getConfig.width 
} 
object Main extends App { 
    Field.config = Some(Config(30, 25)) 
} 
+0

Tôi nghĩ rằng, tôi có được ý tưởng. Cảm ơn! –

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