2012-02-12 37 views
8

Đi bộ điều khiển sau:Tại sao Grails yêu cầu tôi sử dụng `def` thay vì` void` trong bộ điều khiển?

package test 

class TestController { 
    static defaultAction = "test" 

    def test() { 
     render "test" 
    } 
}

Tại sao test định nghĩa với def test() { thay vì một cái gì đó giống như void test() {? Không phải từ khóa def chỉ được sử dụng cho các bao đóng hoặc chức năng trong một tập lệnh (tức là không có trong một lớp Groovy)?

Trả lời

6

Câu trả lời của Burt là chính xác nhưng vấn đề thực sự tôi gặp phải là tôi đã hiểu nhầm những gì def là. Thay vì giống như var trong JavaScript, bạn có thể nghĩ về nó như Object trong Java.

Tôi nghĩ rằng việc sử dụng def là thích làm (JavaScript)

var test = function() { 
    alert("test"); 
}

trong khi trong thực tế nó giống như (Java)

public Object test() { 
    return someObject; 
}

Nó không phải là một loại khác nhau của chức năng/đóng cửa, nó giống như một kiểu trả về— def có thể được áp dụng cho bất kỳ đối tượng nào (Groovy không có dữ liệu nguyên thủy, vì vậy bất kỳ giá trị nào cũng là một đối tượng, không giống như trong Java).

Nó giúp não Java của tôi nghĩ về

def bar = "foo"; 

như

Object bar = "foo"; 
16

render là khoảng trống như vậy trong trường hợp này, hành động test có thể void, nhưng trong trường hợp bạn quay trở lại một mô hình lập bản đồ các hành động phải là phi void:

def create() { 
    [personInstance: new Person(params)] 
} 

Kể từ khi một số hành động có thể trở lại một giá trị và một số không, cú pháp chung phải trả về def để hỗ trợ tất cả các biến thể.

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