2010-04-27 5 views
5

Trong lập trình cuốn sách của ông trong scala (Chương 5 Mục 5.9 Thạc 93) Odersky nêu biểu hiện này "bills !*&^%~ code!"Có phải Odersky nghiêm túc với "hóa đơn! * & ^% ~ Mã!"?

Trong chú thích trên cùng một trang:

"Bởi bây giờ bạn sẽ có thể tìm ra rằng cho mã này, trình biên dịch sẽ Scala

gọi (bills.!*&^%~(code)).!()."

Đó là một chút để khó hiểu đối với tôi, ai đó có thể giải thích những gì đang xảy ra ở đây?

+0

Không ai giải thích câu hỏi ", chưa. – ziggystar

+1

@ziggystar Câu hỏi đã bị thiếu báo giá đóng. Đây không phải là một phần của mã. –

+1

Tôi nghĩ rằng ông Odersky nên tránh nhầm lẫn vô số ký hiệu và viết lời tục tĩu trong số ít nhất, đó là những gì tôi muốn làm –

Trả lời

9

Điều mà Odersky muốn nói là có thể có mã hợp lệ như thế. Ví dụ: mã bên dưới:

class BadCode(whose: String, source: String) { 
    def ! = println(whose+", what the hell do you mean by '"+source+"'???") 
} 

class Programmer(who: String) { 
    def !*&^%~(source: String) = new BadCode(who, source) 
} 

val bills = new Programmer("Bill") 
val code = "def !*&^%~(source: String) = new BadCode(who, source)" 
bills !*&^%~ code! 

Chỉ cần sao chép & dán vào REPL.

+0

@Daniel cảm ơn bạn rất nhiều cho ví dụ tuyệt vời này.Bạn nên được trao một huy hiệu đai scala balck – stacker

+0

@stacker Tôi đã có một huy hiệu vàng, nó phải đủ cho bây giờ. :-) –

2

Tôi không chắc chắn nếu cuốn sách cung cấp chữ ký phương pháp nhưng tôi cho rằng đó chỉ là một lời nhận xét trên đường cú pháp Scala, do đó nó giả định nếu bạn gõ:

bill add monkey 

nơi có một hóa đơn đối tượng trong đó có một phương pháp bổ sung có tham số sau đó nó sẽ tự động diễn giải nó là:

bill.add(monkey) 

Là một chút Scala gỉ, tôi không hoàn toàn chắc chắn cách tách mã! vào (mã).!() ngoại trừ một tiếng lờ mờ mơ hồ của các ô màu xám mà! toán tử được sử dụng để kích hoạt một tác nhân trong thuật ngữ trình biên dịch có thể được hiểu là một phương thức.!() ẩn trên đối tượng.

+0

1 cho giải thích tùy chọn '.()', những gì về điều này ồn ào '! * & ^% ~' làm cho họ có ý nghĩa gì? – stacker

3

Khoảng thời gian là tùy chọn để gọi phương thức nhận một tham số hoặc có danh sách tham số trống.

Khi tính năng này được sử dụng, đoạn tiếp theo sau khoảng trắng sau tên phương pháp được giả định là tham số duy nhất.

Do đó,

(hóa đơn.! * & ^% ~ (code)).!().

giống hệt với

hóa đơn! * & ^% ~ mã!

Dấu chấm than thứ hai gọi phương thức trên giá trị trả lại từ cuộc gọi phương thức đầu tiên.

+0

1 cho giải thích tùy chọn '.' , những gì về điều này ồn ào '! * & ^% ~' làm họ có ý nghĩa gì? – stacker

+0

stacker: trong Scala, bạn có thể cung cấp cho các phương thức tên bằng cách sử dụng (gần như) bất kỳ ký tự nào bạn thích. Đây chỉ là một phương thức có tên '! * &^% ~ '. – Jesper

2

Sự kết hợp của '.()' Là tùy chọn với các cuộc gọi phương thức (như Wysawyg đã giải thích ở trên) và khả năng sử dụng (gần như) bất kỳ ký tự nào bạn thích cho phương pháp đặt tên, làm cho nó có thể viết các phương pháp trong Scala giống như quá tải toán tử. Bạn thậm chí có thể phát minh ra các toán tử của riêng mình.

Ví dụ: tôi có một chương trình liên quan đến đồ họa máy tính 3D. Tôi có lớp riêng tôi Vector cho đại diện cho một vector 3D:

class Vector(val x: Double, val y: Double, val z: Double) { 
    def +(v: Vector) = new Vector(x + v.x, y + v.y, z + v.z) 

    // ...etc. 
} 

Tôi cũng đã xác định một phương pháp ** (không hiển thị ở trên) để tính toán cross product của hai vectơ.Rất thuận tiện khi bạn có thể tạo các toán tử của riêng mình như vậy trong Scala, không nhiều ngôn ngữ lập trình khác có tính linh hoạt này.