2012-01-26 37 views

Trả lời

6

Lý do cho việc này là dấu ngoặc đơn cho cuộc gọi hàm (gọi) là tùy chọn. Tôi thấy điều này là một sự nhầm lẫn liên tục trong mã của riêng tôi và có một chính sách chung luôn luôn bao gồm cả dấu ngoặc đơn để làm cho nó rõ ràng.

Trong tập lệnh cà phê, nếu bạn bỏ dấu ngoặc đơn, nó giả định rằng danh sách đối số sẽ xuất hiện ở cuối dòng. kịch bản ví dụ cà phê đầu tiên của bạn thực sự là giống như thế này:

nums = [1..10].map((i) -> i*2) 

nơi đối số đầu tiên của cuộc gọi để lập bản đồ là một chức năng (i)->i*2

Nếu bạn loại bỏ các khoảng trống giữa bản đồ và (i) sau đó kịch bản cà phê ngụ ý dấu ngoặc đơn xung quanh phần còn lại của dòng. kịch bản ví dụ cà phê thứ hai của bạn thực sự là giống như thế này:

nums = [1..10].map(i)(-> i*2) 

đây bạn có thể xem bản đồ đang được gọi với i như là đối số duy nhất và sau đó kịch bản cà phê dự kiến ​​các map(i) lời kêu gọi trả về một hàm mà sau đó được gọi là đi qua ->i*2 hoặc rõ ràng hơn ()->i*2 làm đối số.

Do kịch bản cà phê được thiết kế để loại bỏ các mối nguy tiềm ẩn mã hóa tiềm năng của javascript, tôi nghĩ rằng nó sẽ an toàn hơn nhiều nếu chúng không bao gồm dấu ngoặc đơn ngụ ý này.

4

Các map(i) trong một giây được hiểu như là một lời gọi hàm. JavaScript đi ra như thế này:

var nums; 

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(i)(function() { 
    return i * 2; 
}); 

và điều đó không có ý nghĩa gì vì map không trả lại một chức năng và không có i xác định.

Trong trường hợp đầu tiên, không gian biến nó thành [1..10].map((i) -> i*2) để bạn kết thúc gọi map với chức năng làm đối số; JavaScript trong trường hợp này trông giống như sau:

var nums; 

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(function(i) { 
    return i * 2; 
}); 
+0

Tôi thích CoffeeScript. Đừng hiểu lầm tôi ... nhưng loại vấn đề khoảng trắng này làm tôi khó chịu. Từ góc độ dễ đọc, có vẻ như nó không quan trọng ... nhưng nó có. Đây là lý do tại sao bất cứ khi nào tôi nghĩ ra sự mơ hồ này, tôi thường loại bỏ nó và viết: 'map ((i) -> i * 2)' để nó không thể vô tình được diễn giải sai. –

+1

Tôi sẽ đi xa hơn Brian, để tránh những thứ này, nhóm của tôi và tôi đã quyết định không sử dụng khả năng của CoffeeScript để thoát khỏi các parens cho các cuộc gọi chức năng. Tôi bỏ qua các mệnh lệnh trong mệnh đề 'if' và những nơi khác mà javascript yêu cầu một vị từ được bao bọc trong các dấu ngoặc đơn. Nhưng tôi sử dụng chúng cho tất cả các cuộc gọi chức năng. Tôi viết '() ->' hơn là chỉ '->'. Ví dụ của bạn, tôi sẽ viết nó giống như Brian, '... map ((i) -> i * 2)'; dễ đọc hơn nhiều trong quan điểm của tôi. –

+1

Tôi không bị thuyết phục về những khoảng trống bên trong đó, tôi muốn viết: 'xs.map ((x) -> x * 2)'.Nếu không, tôi đồng ý với cả hai bạn, kiểu dáng dấu ngoặc đơn trông rất đẹp khi viết mã kiểu DSL, nhưng khi viết mã "bình thường", bạn sẽ gặp phải vấn đề (ví dụ, điều này cũng xảy ra trong Ruby). Sử dụng parenthenses có một ưu điểm khác: bạn có thể viết các khối đa dòng theo phong cách Ruby có thể ghép nối trông khá tốt (bằng cách sử dụng ')' khi có 'kết thúc'). – tokland

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