“Splats” trong hướng dẫn CoffeeScript có nghĩa là gì?


114

Xem hướng dẫn CoffeeScript này: http://jashkenas.github.com/coffee-script/

Tôi không hiểu Splats dùng để làm gì. Xây dựng này là gì? Nó đến từ đâu (lịch sử)


Và như thường lệ, bạn cũng nên biết cách nó có thể được triển khai trong vanilla Js: arguments+ call: stackoverflow.com/questions/17380315/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
Tôi thích nghĩ về nó như một tham số đó được "splatted" (như sơn) vào một liên tục vô thời hạn
arviman

3
Đối với bất cứ ai Python-nghiêng: đây là bạn *argstrong def foo(*args):.
maligree

1
Lưu ý thuật ngữ: ES6 áp dụng cú pháp tiền tố nhưng tương tự. Trong ES6 nhận , ...argsđược đặt tên theo các thông số còn lại và mở rộng ...argsthành một chữ chức năng cuộc gọi / mảng / đối tượng được đặt tên lây lan
Beni Cherniavsky-Paskin

Câu trả lời:


199

Thuật ngữ "toán tử splat" bắt nguồn từ Ruby, trong đó *ký tự (đôi khi được gọi là "splat" —xem mục nhập Tệp Biệt ngữ ) được sử dụng để chỉ ra rằng một mục nhập trong danh sách đối số sẽ "hấp thụ" danh sách đối số.

CoffeeScript thông qua các sọc Ruby-phong cách rất sớm (xem vấn đề 16 ), nhưng theo gợi ý của Douglas Crockford, cú pháp được thay đổi từ *xđến x...một vài tuần sau đó (xem vấn đề 45 ). Tuy nhiên, CoffeeScripters vẫn gọi cú pháp là "splat" hoặc "splat operator".

Đối với những gì chúng thực sự làm, các splat cắt argumentsđối tượng theo cách mà đối số splatted trở thành một mảng của tất cả các đối số "phụ". Ví dụ nhỏ nhất là

(args...) ->

Trong trường hợp này, argssẽ chỉ đơn giản là một bản sao mảng của arguments. Các đối số rải rác có thể đến trước, sau hoặc giữa các đối số chuẩn:

(first, rest...) ->
(rest..., last) ->
(first, rest..., last) ->

Trong hai trường hợp đầu tiên, nếu hàm nhận 0-1 đối số, restsẽ là một mảng trống. Trong trường hợp cuối cùng, hàm cần nhận nhiều hơn 2 đối số restđể không trống.

Vì JavaScript không cho phép nhiều chữ ký cho các hàm có cùng tên (theo cách mà C và Java làm), các biểu tượng phân tách là một công cụ tiết kiệm thời gian rất lớn để xử lý số lượng đối số khác nhau.


2
Tương tự với paramstừ khóa C # .
ThatMatthew, 27/09/12

Khi nào tôi cần sử dụng cái này?
Jeff Scott Ward

1
khi bạn không chắc chắn về số lượng tham số mà bạn muốn chấp nhận.
gprasant,

1
Về mặt kỹ thuật, được gọi là [chức năng đa dạng] ( en.wikipedia.org/wiki/Variadic_ Chức năng ), hoặc một chức năng "hiếm có" vô thời hạn. Hầu hết các ngôn ngữ sử dụng một số dạng dấu chấm lửng để biểu thị các đối số biến.
Lawrence Dol

1
@JeffScott Có một ví dụ hoàn hảo là console.log, nó chấp nhận bất kỳ số lượng đối số nào. console.log('this:',variable,'should be replaced with', another_variable);
Rob

13

nếu bạn biết python, args...gần giống với *args, vì nó cho phép bạn coi các tham số hàm là danh sách

ví dụ:

concat = (args...) -> args.join(', ')
concat('hello', 'world') == 'hello, world'
concat('ready', 'set', 'go!') == 'ready, set, go!'

nó cũng hoạt động trong các khoản phụ:

[first, rest...] = [1, 2, 3, 4]
first == 1
rest == [2, 3, 4]

6

Splats là thuật ngữ chỉ việc sử dụng ...toán tử cho var-args (các hàm nhận một số đối số thay đổi).


Xem thêm: * args và ** kwargs của Python và tham số nghỉ của ActionScript 3.
Jordan

3

Tôi nghĩ rằng nó là một đường cú pháp cho đối tượng đối số của javascript.

Ý tưởng có thể hình thành từ toán tử biểu tượng* của ruby .


về mặt kỹ thuật, nó nhiều hơn một chút, vì nó có thể được sử dụng bên trái trong các bài tập và có thể được kết hợp với các đối số được đặt tên: in (x, rest...) ->, restwont contains x, argumentsdoes.
keppla
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.