2011-12-11 38 views
8

Tôi đã xem qua chút mã này:Phương thức nào hoạt động trong Groovy?

n = args[0] as Long 
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) } 

Nó được sử dụng để in một hình thức cây cấu trúc. Như thế này:

* 
    *** 
    ***** 
******* 
    * 

(cho n = 4)

  1. Làm thế nào để mã [*n..1,n] sản xuất [4, 3, 2, 1, 4]?

  2. Phương thức any hoạt động ở đây như thế nào? Các Doc không giúp tôi nhiều. Dự đoán nào có thể được chuyển đến any (như đã đề cập trong số Doc)?

Sử dụng any và cách xử lý trong trường hợp này?

+2

@DownVoter: tại sao một downvote? 'bất kỳ' sai trong câu hỏi này;)? –

Trả lời

10

Q1a: * "bỏ gói" một mảng. .. tạo phạm vi. [] tạo bộ sưu tập.
Q1b: *n..1 bỏ gói [4,3,2,1] vào từng bộ phận riêng lẻ.
Q1c: [4,3,2,1,n] == [4,3,2,1,4]

Q2: Tôi không biết tại sao any được sử dụng tại đây; each cũng hoạt động tốt và có ý nghĩa hơn trong ngữ cảnh. anyhiện lặp qua kết nối, do đó, println các chức năng phụ có hiệu lực như dự định.

thường any sẽ được sử dụng để xác định xem bất kỳ yếu tố thu gặp một tiêu chí, ví dụ:

[*n..1,n].any { it > 10 } // Returns false, no elements are > 10 
[*n..1,n].any { it == 3 } // Returns true, because at least one element is 3 

Tuyên bố cuối cùng của việc đóng cửa được sử dụng để xác định xem từng hạng mục đáp ứng các tiêu chí. println trả về null, vì vậy any sẽ trả về false. Giá trị không được sử dụng và bị loại bỏ.

Lý do duy nhất tôi có thể nghĩ rằng ai đó có thể đã sử dụng any là để tránh nhìn thấy giá trị trả lại của each trong bảng điều khiển. each trả về bộ sưu tập gốc.

+1

Lý do khác để sử dụng '.any' là sử dụng số ký tự tối thiểu trong Cuộc thi Golf Code [Làm thế nào để in ra cây thông Noel có chiều cao N] (http: // codegolf.stackexchange.com/q/4244) –

+0

@ArturoHerrero: ya đúng từ đó chỉ có mã;) –

3

1) n..1 được gọi là phạm vi theo nghĩa đen, nó tạo đối tượng groovy.lang.Range giảm 1 từ n đến 1. Sau đó, trường hợp này được hợp nhất vào bối cảnh danh sách xung quanh bằng cách sử dụng "Spread operator (*)"

2) phương pháp any được xác định trong DefaultGroovyMethods và đó là hàm vị ngữ trả về true nếu phần tử trong bộ sưu tập thỏa mãn vị từ được cung cấp . Trong ví dụ này, mã không kiểm tra giá trị trả về, do đó, ban đầu khác có thể đã tạo ra cùng một đầu ra bằng cách sử dụng lệnh gọi each thay thế.

+0

cảm ơn câu trả lời;) –

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