2010-07-29 29 views
6

Trong một số ngôn ngữ, nếu một hàm trả về một mảng, sau đó như trái ngược với lưu trữ mảng trong một biến sau đó lấy một yếu tố duy nhất, như thế này:Có tên cho cú pháp này getSomeValues ​​() [0] không?

var someValues = getSomeValues(); 
var firstElement = someValues[0]; 

Bạn có thể sử dụng các ký hiệu chỉ số mảng trực tiếp sau khi gọi hàm để truy lục phần tử của mảng được trả về, như sau:

var firstElement = getSomeValues()[0]; 

Cấu trúc hoặc cú pháp này được gọi là gì? Nó có một cái tên đặc biệt không?

+1

Đó là [mảng dereferencing] (http://wiki.php.net/rfc/functionarraydereferencing) và một bản sao của [phần tử mảng Truy cập từ gọi hàm trong php] (http: // stackoverflow. com/questions/2282051/access-array-element-from-function-call-in-php) – Gordon

+1

@Gordon: trên suy nghĩ thứ hai, tôi không nghĩ rằng nó thực sự là một bản sao kể từ khi tôi hỏi những gì nó được gọi là trong khi câu hỏi đó đang hỏi tại sao nó không hoạt động trong PHP. Nhưng ồ, ít nhất tôi biết tên của nó bây giờ. – BoltClock

+0

@BoltClock đúng, nhưng bạn nhận được câu trả lời cho bạn bằng cách đọc câu hỏi khác, vì vậy trong khi ngữ nghĩa không phải là bản sao, nó chứa đủ thông tin để trả lời câu hỏi của bạn. – Gordon

Trả lời

3

Bạn có thể sử dụng các ký hiệu chỉ số mảng trực tiếp trên gọi hàm để lấy phần tử

var firstElement = getSomeValues()[0]; 

gì bạn đang làm là truy cập vào các yếu tố được lập chỉ mục của mảng/bộ sưu tập được trả về bởi hàm. Bạn không trực tiếp truy cập vào một chỉ mục trong một hàm.

Tôi sẽ gọi đây là "chuỗi" một người lập chỉ mục cho giá trị trả lại.

+0

Vâng, tôi đã làm điều đó. Tôi nên rõ ràng hơn trong câu hỏi của tôi. – BoltClock

+0

@BoltClock - Vì vậy, nếu tôi hiểu điều này một cách chính xác câu trả lời của tôi không phải là những gì bạn đang tìm kiếm? – ChaosPandion

+0

@ChaosPandion: Tôi sẽ không chắc chắn bản thân mình kể từ khi tôi yêu cầu, nhưng nếu bạn hiểu nó được như vậy, do đó, được nó. – BoltClock

1

Eh .. Nguy hiểm ... ??

Nếu không có phần tử nào trong mảng được trả về.

Đó là một thói quen xấu để tham gia khi nói đến xử lý mảng, javascript sang một bên theo nhận xét.

Ngoài ra các ý tưởng được gọi là 'phương pháp chaining'

+0

Xin vui lòng xây dựng. – ChaosPandion

+2

Ok, nhưng chỉ để rõ ràng điều này sẽ không nguy hiểm trong một ngôn ngữ như JavaScript. Trừ khi tất nhiên bạn thử và gọi giá trị trả về 'undefined' là một hàm. – ChaosPandion

1

Tôi tin rằng nó không có bất kỳ tên đặc biệt. Bạn chỉ cần truy cập phần tử đầu tiên của một mảng được trả về. Trong nhiều ngôn ngữ, không có gì đặc biệt trong một hàm trả về một mảng.

Trong trường hợp của bạn, bạn không áp dụng [] (indexing) điều hành một cuộc gọi chức năng. Thay vào đó, bạn áp dụng nó vào mảng được trả về. Với ưu tiên, nó trông như thế này.

var firstElement = (getSomeValues())[0]; 

Vì vậy, không có gì đặc biệt trong đó.


Tuy nhiên, có một mô hình khác nhận yếu tố đầu tiên, liên quan đến lập trình hàm. Ví dụ:

($first_value, @rest_of_list) = getSomeValues(); # Perl 
let first::rest = getSomeValues() in ...   (* OCaml *) 

Điều này tiết kiệm giá trị đầu tiên của một danh sách (về mặt kỹ thuật, chứ không phải của một mảng) vào $first_value, và phần còn lại được lưu trữ trong biến mảng. Biến mảng đó có thể bị bỏ qua, và sau đó bạn chỉ nhận giá trị đầu tiên.

($first_value) = getSomeValues();  # Perl 
let first::_ = getSomeValues() in ... (* OCaml *) 

Khái niệm chung chung hơn, trong đó có những gì trình bày ở trên chỉ là một trường hợp đặc biệt, là mô hình phù hợp với (more on pattern matching). Trong một số ngôn ngữ chức năng (không có ví dụ nào ở trên, nhưng trong Haskell, ví dụ) nó khác: nó thực sự chỉ tính toán phần tử đầu tiên, và không làm cho phần còn lại của danh sách được đánh giá.

Tuy nhiên, không có gì có thể đủ điều kiện làm mẫu phù hợp với tất cả trong mã thủ tục mà bạn đã hiển thị.

+0

Cảm ơn bạn đã giải thích kỹ lưỡng, * và * ví dụ về lập trình hàm. +1 – BoltClock

+0

'sequence.First()' sẽ là cuộc gọi .NET tương đương? – ChaosPandion

2

mảng dereferencing

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