2010-08-16 26 views

Trả lời

16

Bạn đang không xác định một biến trong cả hai trường hợp. Bạn đang xác định một phương thức. Phương thức đầu tiên không có danh sách tham số, phương thức thứ hai có một danh sách tham số, nó trống. Là người đầu tiên trong số này nên được gọi như thế này

val x = foo 

trong khi thứ hai nên được gọi như thế này

val x = foo() 

Tuy nhiên, trình biên dịch Scala sẽ cho phép bạn gọi các phương thức với một danh sách tham số có sản phẩm nào mà không có dấu ngoặc , do đó, một trong hai dạng cuộc gọi sẽ hoạt động cho phương thức thứ hai. Không thể gọi các phương thức không có danh sách tham số bằng dấu ngoặc đơn

Kiểu Scala ưa thích là xác định và gọi phương thức không đối số có tác dụng phụ với dấu ngoặc đơn. Các phương thức không có đối số không có các hiệu ứng phụ nên được định nghĩa và được gọi mà không có các dấu ngoặc đơn.

Nếu bạn thực sự để xác định một biến, cú pháp là

val foo = 5 
+5

Trên thực tế, Scala sẽ cho phép bạn bõ mẫu âm chót bất kỳ số lượng (trailing) danh sách tham số trống! Hãy thử 'def x()()()()()()() = 5'! –

4

có nghĩa là gì khi tôi sử dụng def để xác định một lĩnh vực trong Scala

Bạn không thể định nghĩa một lĩnh vực sử dụng def.

Có vẻ rằng trong cả hai trường hợp, tôi kết thúc với một foo biến mà tôi có thể tham khảo mà không cần ngoặc, luôn luôn đánh giá để 5.

Không, trong cả hai trường hợp bạn kết thúc với một phương pháp foo, bạn có thể gọi mà không cần dấu ngoặc đơn.

Để thấy rằng, bạn có thể sử dụng javap:

// Main.scala 
object Main { 
    def foo1 = 5 
    def foo2() = 5 
} 


F:\MyProgramming\raw>scalac main.scala 

F:\MyProgramming\raw>javap Main 
Compiled from "main.scala" 
public final class Main extends java.lang.Object{ 
    public static final int foo2(); 
    public static final int foo1(); 
} 

Tuy nhiên, xem http://tommy.chheng.com/index.php/2010/03/when-to-call-methods-with-or-without-parentheses-in-scala/

6

Trước khi bất cứ điều gì khác đang nói, def không định nghĩa một lĩnh vực, nó định nghĩa một phương thức.

Trong trường hợp thứ hai, bạn có thể bỏ qua dấu ngoặc đơn vì một tính năng cụ thể của Scala. Có hai điểm khác biệt đáng quan tâm ở đây: một cơ chế và một trong những cách sử dụng được khuyến nghị.

Bắt đầu bằng cách sau, bạn nên sử dụng danh sách tham số trống khi có các tác dụng phụ. Một ví dụ cổ điển là close(). Bạn sẽ bỏ qua dấu ngoặc đơn nếu không có tác dụng phụ nào để gọi phần tử.

Bây giờ, như một sự khác biệt thực tế - ngoài những cú pháp cú pháp kỳ lạ trong các trường hợp góc (tôi không nói có, chỉ phỏng đoán) - các kiểu cấu trúc phải tuân thủ đúng quy ước.

Ví dụ: Source có phương thức close không có dấu ngoặc đơn, có nghĩa là loại cấu trúc là def close(): Unit sẽ không chấp nhận Source. Tương tự như vậy, nếu tôi xác định phương thức cấu trúc là def close: Unit, thì đối tượng Java closeable sẽ không được chấp nhận.

3

Ngoài ra các câu trả lời đã đưa tôi muốn nhấn mạnh hai điểm:

  • Khả năng để xác định phương pháp mà không có một danh sách tham số là một cách để nhận ra Uniform Access Principle. Điều này cho phép để ẩn sự khác biệt giữa các lĩnh vực và phương pháp, mà làm cho thay đổi thực hiện sau này dễ dàng hơn.

  • Bạn có thể gọi một phương pháp định nghĩa là def foo() = 5 sử dụng foo, nhưng bạn không thể gọi một phương pháp định nghĩa là def foo = 5 sử dụng foo()

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