2012-01-23 32 views
6

Tôi muốn làm một cái gì đó trong Scala tôi sẽ làm trong Java như thế này:Scala null như giá trị mặc định cho tham số tên Int

public void recv(String from) { 
    recv(from, null); 
} 
public void recv(String from, Integer key) { 
    /* if key defined do some preliminary work */ 
    /* do real work */ 
} 

// case 1 
recv("/x/y/z"); 
// case 2 
recv("/x/y/z", 1); 

Trong Scala tôi có thể làm:

def recv(from: String, 
     key: Int = null.asInstanceOf[Int]) { 
    /* ... */ 
} 

nhưng có vẻ xấu xí. Hoặc tôi có thể làm:

def recv(from: String, 
     key: Option[Int] = None) { 
    /* ... */ 
} 

nhưng bây giờ gọi với phím trông xấu xí:

// case 2 
recv("/x/y/z", Some(1)); 

các hợp Scala cách là gì? Cảm ơn bạn.

+0

gì về giá trị mặc định = -1 hay 0? – sschaef

+0

@Antoras Đó là có thể, nhưng không thanh lịch (giả sử rằng khóa có thể là bất kỳ giá trị Int). – woky

+3

"Một số" sẽ ngừng trông xấu xí khi nó giúp bạn tiết kiệm từ vài chục NullPointerExceptions :) –

Trả lời

15

Cách Option là cách Scala. Bạn có thể làm cho mã người dùng đẹp hơn một chút bằng cách cung cấp các phương thức trợ giúp.

private def recv(from: String, key: Option[Int]) { 
    /* ... */ 
} 

def recv(from: String, key: Int) { 
    recv(from, Some(key)) 
} 

def recv(from: String) { 
    recv(from, None) 
} 

null.asInstanceOf[Int] đánh giá là 0 bằng cách này.

+0

Tôi không biết tôi có thể "quá tải" phương pháp trong Scala, cảm ơn bạn! – woky

+1

Hmm, tôi đã chỉ cần đặt của OP '/ * làm một số công việc sơ bộ */'trong quá tải hai phương pháp, và sau đó đã có gọi là một phương pháp quá tải mà không làm việc'/* thực */'? Việc sử dụng 'Tùy chọn 'có thêm Scala thành ngữ không? –

+0

@TimGoodman, "sau đó đã gọi đó là một phương thức quá tải" - với đối số nào? – missingfaktor

2

Cách thích hợp là, tất nhiên, để sử dụng Option. Nếu bạn gặp vấn đề với giao diện của nó, bạn luôn có thể sử dụng trong Java: sử dụng java.lang.Integer.

3

Option thực sự có âm thanh như giải pháp đúng cho vấn đề của bạn - bạn thực sự muốn có "tùy chọn" Int.

Nếu bạn đang lo lắng về những người gọi phải sử dụng Some, tại sao không:

def recv(from: String) { 
    recv(from, None) 
} 

def recv(from: String, key: Int) { 
    recv(from, Some(key)) 
} 

def recv(from: String, key: Option[Int]) { 
    ... 
} 
+0

Tôi không biết tôi có thể" quá tải "phương pháp trong Scala, cảm ơn bạn! – woky

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