2013-07-09 48 views
6

Ok, tôi nghĩ điều đó là không thể. Nhưng tuy nhiên: Có thể biết bên trong một phương thức gọi nếu phương thức được gọi là một phần của một cuộc gọi hàm?Tìm hiểu xem đối số chức năng có phải là một phần của cuộc gọi hàm

Ví dụ (và chức năng cuộc gọi thực tế của tôi):

HDMExpressionSQLSelectBuilder *sb = [[[HDMExpressionSQLSelectBuilder alloc] init] autorelease]; 
[sb orNestedWhere:[sb where:@"wheraCoumnB" equals:@"whereBEqualValue"], [sb where:@"wheraCoumnB" equals:@"sth"], nil]; 

Có hai điều xảy ra từ đây trên:

  • Những lập luận được đánh giá trong bất kỳ thứ tự (trong đó trật tự không phải là định trong tiêu chuẩn C và nó thay đổi giữa các trình biên dịch và các cài đặt )
  • Thực tế điều này sẽ hiển nhiên đối với mọi lập trình viên: Các hàm bên trong là đánh giá trước

Bây giờ tôi muốn biết ví dụ bên trong lời gọi phương thức này ...

[sb where:@"wheraCoumnB" equals:@"whereBEqualValue"] 

.. rằng nó đã được gọi là một phần của một cuộc tranh cãi của một hàm.

Có thể? Ma thuật đen?

Trước khi bạn đến và nói rằng tôi đang làm sai, và tôi nên sửa mã của tôi: Tôi cho rằng tôi có một trong những trường hợp hiếm hoi mà nó sẽ có ý nghĩa để biết điều đó. Tôi đang viết một trình xây dựng truy vấn và điều này sẽ giúp bạn dễ dàng sử dụng các điều kiện lồng nhau. Nếu không tôi sẽ phải làm một số nestedAndBegin ngớ ngẩn và sau đó nestedAndEnd để thực hiện dấu ngoặc, và như vậy. Nó sẽ là vụng về trong trường hợp này, trình xây dựng truy vấn của tôi là dựa trên cây và tôi không muốn làm điều này (không giống như các trình xây dựng truy vấn xâu chuỗi tất cả những gì được yêu cầu là đặt nút cho biểu thức logic tại chỗ).

Cập nhật

Vì vậy, đây là gì ngạc nhiên không thể. Đối với những người quan tâm đến cách tôi làm việc xung quanh vấn đề này cho vấn đề cụ thể của mình: Tôi đã thực hiện nó để tất cả các cuộc gọi đến các hàm bị trì hoãn, do đó các cuộc gọi đến một hàm của trình tạo truy vấn của tôi đặt một đối tượng gọi phương thức với các đối số hàm vào danh sách yêu cầu . Nó không thực thi bất kỳ mã phương thức nào tại thời điểm đó. Mỗi đối tượng gọi có một chuỗi trình tự tự động inc, vì vậy tôi biết khi nào một hàm được đánh giá. Bây giờ trong các hàm lồng nhau và vv (vì vậy các hàm mà câu hỏi của tôi là về) tôi kiểm tra xem ID trình tự của các đối tượng gọi được lưu trữ có tương ứng với chỉ số đối số của lệnh gọi hàm hay không. Nếu không, đây là thời điểm thích hợp để sắp xếp lại chúng.

Giai đoạn kiểm tra cú pháp và truy vấn xây dựng sau đó được hoãn lại cho đến khi người dùng thực sự gọi phương thức query() (hoặc ast() để lấy cây biểu thức).

Trả lời

3

Không, không có cách nào (thực tế) để thực hiện điều đó. Bạn có thể, về mặt lý thuyết, thêm một số mã trong phương pháp của bạn đọc các biểu tượng gỡ lỗi từ nhị phân của bạn, kiểm tra thanh ghi liên kết và sau đó sử dụng thông tin đó để tìm ra trang gọi, tải mã nguồn từ nơi khác, và tìm ra ánh xạ, phân tích cú pháp mã nguồn và tìm ra nó đang được gọi khi bạn mô tả.

+0

Tôi tin rằng đây là câu trả lời đúng, nhưng có thể ai đó biết về cách giải quyết khả thi. Tôi có thể nếu không có thể thêm một số loại giao dịch đăng nhập, mà sẽ đảo ngược những thay đổi cuối cùng bởi các chức năng bên trong và áp dụng lại chúng theo thứ tự chính xác tại thời điểm chức năng bên ngoài được gọi là.Nhưng tiếc là điều này có nghĩa là để phá vỡ với một số khả năng xác nhận cho việc xây dựng truy vấn. – benjist

+0

Bạn cũng có thể chuyển các bộ chọn và đối số xung quanh. –

+0

ha, có thể là vậy. Tôi có thể, thay vì xây dựng cây trực tiếp, thu thập tất cả (bản sao) của các đối số và bộ chọn. và áp dụng chúng đúng thứ tự khi chuỗi truy vấn được yêu cầu (bao gồm cả kiểm tra cú pháp, mặc dù tại một điểm sau này) – benjist

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