2011-03-17 30 views
9

Khi gỡ lỗi đối số dòng lệnh xử lý trong Java Tôi đang sử dụng để làmCó cách nào để cho các đối số được var thay vì val?

args = new String[] { "some", "new", "arguments" }; 

(đặc biệt hữu ích nếu có một tên tập tin như là đối số mà bạn thường xuyên thay đổi, nhưng không muốn phải trải qua một số cửa sổ hộp thoại ở mặt IDE). Điều này có lợi ích mà tôi có thể chỉ đơn giản là bình luận ra dòng khi xây dựng một bản phát hành.

Vì vậy, khi tôi đã thử điều này trong Scala, tôi phát hiện ra rằng đối số là val s. (Và tôi không thể viết var trước thông số).

  • Q1: Lý do cơ bản cho điều này là gì?
  • Q2: Vậy là có bất kỳ công việc xung quanh rõ ràng ngoại trừ làm

    val newArgs = if (...) args else Array("some", "new", "arguments") 
    

    và dính vào newArgs trong phương thức main còn lại?

Trả lời

13

Q1: đột biến các thông số đầu vào thường được xem phong cách là xấu và làm cho nó khó khăn hơn để suy luận về mã.

Q2: Bạn có thể gán args thành var trước khi thực hiện bất kỳ thứ gì với nó.

+0

Q1, điểm tốt. Q2, vâng. Đó là tốt hơn so với if-line, bởi vì sau đó tôi có thể chỉ đơn giản là bình luận ra việc tái chỉ định như trong trường hợp của Java. Cảm ơn! – aioobe

1

Mảng là có thể thay đổi, vì vậy nếu bạn cứ khăng khăng:

Seq("some", "new", "arguments").copyToArray(args, 0, 3) 

Điều đó không, tất nhiên, chỉ làm việc nếu có đủ không gian trong mảng trôi qua.

Hãy nhớ rằng bạn có thể sử dụng các tham số mặc định trong Scala để giải quyết câu hỏi ban đầu của mình theo cách gọn gàng hơn nhiều.

+0

Bạn có thể đưa ra ví dụ về tham số mặc định như vậy cho phương pháp chính không? – aioobe

+0

Ah, xin lỗi, đã bị mang đi đó. Không hoạt động vì trong trường hợp không có tham số, một mảng trống sẽ được chuyển. Có lẽ đó có thể đáng để thay đổi. – Raphael

0

Nếu bạn chỉ muốn sửa đổi bên trong của hàm, thì cách tiếp cận của bạn trong mô tả là đủ.

Tuy nhiên, nếu bạn cần phải đối xử với nó như là một "tài liệu tham khảo" đúng kiểu và giữ những sửa đổi có hiệu lực bên ngoài chức năng, bạn có thể quấn các đối số trong một lớp học trường hợp, ví dụ:

case class Ref[A](var value: A) 

Và sử dụng nó như:

def modify(refInt: Ref[Int]) = refInt.value = 3 

Sau đó, khi bạn sử dụng refInt.value ngoài chức năng, nó vẫn sẽ là 3.

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