2010-06-22 33 views

Trả lời

17

Tôi không chắc chắn quy ước là gì để sử dụng _!_!! trong Nâng, nhưng đây là một chút thông tin cơ bản.

Bất kỳ số nhận dạng chữ và số nào đều có thể _ và danh sách các biểu tượng được thêm và vẫn được phân tích cú pháp dưới dạng số nhận dạng duy nhất. Ví dụ:.

scala> class [email protected]%*! 
defined class Example_$bang$at$percent$times$bang 

(Trong thực tế, bạn có thể phân tích hầu như mọi thứ một định danh: nếu bạn đặt nó với backticks - và đây là những gì bạn làm gì nếu một lớp Java sử dụng một Scala từ dành riêng, ví dụ Hoặc nếu bạn muốn không gian trong số nhận dạng của mình.)

Trình biên dịch chỉ nhận ra một kết thúc tượng trưng đặc biệt, tuy nhiên. Nếu có một phương thức trông giống như getter, thì getter_ = sẽ được hiểu là setter. (Cho dù bạn thực sự sử dụng nó như là một setter là tùy bạn;. Nó sẽ có ngữ nghĩa của một setter, dù sao) Vì vậy

scala> class Q { def q = "Hi"; def q_=(s: String) { println(s.reverse) } } 
defined class Q 

scala> val q = new Q 
q: Q = [email protected] 

scala> q.q 
res0: java.lang.String = Hi 

scala> q.q = "Could use this to set something" 
gnihtemos tes ot siht esu dluoC 

Bên cạnh đó, trình biên dịch đảo ngược thứ tự của người gọi và callee trong mọi phương thức kết thúc bằng :. Điều này thường thấy nhất trong danh sách: newElement :: existingList thực sự là cuộc gọi đến existingList.::(newElement). Vì vậy, ví dụ:

scala> object Caps { def to_:(s: String) = s.toUpperCase } 
defined module Caps 

scala> "Example" to_: Caps 
res40: java.lang.String = EXAMPLE 

Bất kỳ cách sử dụng nào khác là _ + ký hiệu là quy ước.

+0

Chà. Bài giảng tuyệt vời. Tôi biết hầu như không ai trong số này. Cảm ơn! – aioobe

+3

'_' được sử dụng để tách các nhóm ký tự từ khỏi các ký tự biểu tượng. Vì vậy, 'foo _ !! _ bar' là một định danh hợp pháp. Nếu bạn không muốn thực hiện theo quy tắc này, hoặc cần phải sử dụng một từ dành riêng, bạn cũng có thể kèm theo nó trong backticks. Điều này rất hữu ích khi gọi các phương thức java có tên là 'type', ví dụ. – retronym

+2

@retronym - Điểm tốt về backticks; Tôi sẽ thêm nó. Hãy thử gõ 'val foo _ !! _ bar = 0' vào REPL, mặc dù .... –

8

Không có ý nghĩa đặc biệt đối với! trong tên Scala. Trong gia đình của ngôn ngữ dựa trên Lisp,! thường được sử dụng để chỉ ra rằng một hàm có các tác dụng phụ và có vẻ là quy ước ở đây.

+2

Quy ước tương tự khác là sử dụng để sử dụng danh sách tham số zero cho các hàm miễn phí có hiệu lực phụ và một danh sách tham số trống cho người khác. ví dụ. 'gun.model' vs' gun.fire() ' – retronym

+2

Ruby sử dụng'! 'cho * tác dụng phụ * cũng – OscarRyz

6

Điều lạ lùng cho đến nay (mặc dù không đặc biệt liên quan đến câu hỏi của bạn) là unary_! được điều trị đặc biệt.

scala> class A { def unary_! = 5 } 
defined class A 

scala> !(new A) 
res0: Int = 5 
+2

Nó có nhiều hơn để làm với unary_ sau đó! cuối cùng. Bạn có thể có unary_ + ví dụ –

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