2012-08-02 35 views
6

Có thể tạo trình bao bọc xung quanh một hàm có cùng tên giống với hàm ban đầu không?Làm thế nào để bọc một chức năng đã tồn tại với chức năng mới có cùng tên

này sẽ rất hữu ích trong trường hợp người dùng muốn làm một số kiểm tra bổ sung đối với các biến đầu vào trước khi chúng được chuyển sang cho việc xây dựng trong chức năng How to interrupt MATLAB IDE when it hangs on displaying very large array?

+0

Tôi đồng ý với câu trả lời bạn đã đăng trên câu hỏi khác (http://stackoverflow.com/questions/11779511/how-to-interrupt-matlab-ide-when-it-hangs-on-displaying-very-large- mảng) là tốt cho câu hỏi đó slayton, nhưng câu hỏi chung có một câu trả lời tốt hơn - xem dưới đây. – jmetz

Trả lời

11

Thực ra cách khác để Slayton của trả lời bạn không cần phải sử dụng openvar. Nếu bạn định nghĩa một hàm có cùng tên với hàm matlab, hàm này sẽ đổ bóng hàm đó (tức là được gọi thay thế).

Để sau đó tránh đệ quy gọi chức năng của riêng bạn, bạn có thể gọi hàm ban đầu từ trong trình bao bọc bằng cách sử dụng builtin.

ví dụ:

outputs = builtin(funcname, inputs..); 

ví dụ đơn giản, tên rand.m và trong đường dẫn matlab:

function out = main(varargin) 
disp('Test wrapping rand... calling rand now...'); 
out = builtin('rand', varargin{:}); 

Note rằng điều này chỉ hoạt động cho các chức năng được tìm thấy bởi builtin. Đối với những người không, cách tiếp cận của slayton có thể là cần thiết.

+0

nhưng có rất nhiều chức năng không được 'xây dựng trong' và tôi muốn bọc tất cả chúng! –

+0

@GuntherStruyf: tại sao bạn muốn bọc tất cả chúng ... đặc biệt là những cái không được xây dựng? – jmetz

+0

Tại nơi làm việc, cài đặt MATLAB của chúng tôi là chỉ đọc, do đó không thể tự thay đổi tệp. Và nó không thuận tiện để luôn luôn sử dụng myfuninstead của niềm vui. đặc biệt là khi nó cải thiện hành vi mặc định. Ứng dụng thực tế: [Vấn đề của Daniel Kessler] (http://stackoverflow.com/questions/11779511/how-to-interrupt-matlab-ide-when-it-hangs-on-displaying-very-large-array) –

3

Có điều này là có thể nhưng nó đòi hỏi một chút của tin tặc. Nó đòi hỏi bạn phải sao chép xung quanh một số chức năng xử lý.

Sử dụng ví dụ được cung cấp trong câu hỏi, tôi sẽ chỉ cách bọc hàm openvar trong hàm do người dùng xác định để kiểm tra kích thước của biến đầu vào và sau đó cho phép người dùng hủy bất kỳ hoạt động mở nào cho các biến quá lớn.

Ngoài ra, điều này sẽ hoạt động khi người dùng nhấp đúp vào một biến trong ngăn Workspace của IDE Matlab.

Chúng tôi cần làm ba việc.

  1. Lấy một handle của bản gốc openvar chức năng
  2. Xác định chức năng wrapper mà các cuộc gọi openvar
  3. Chuyển bản gốc openvar tên cho chức năng mới của chúng tôi.

Function Ví dụ

function openVarWrapper(x, vector) 

    maxVarSize = 10000; 
    %declare the global variable 
    persistent openVarHandle; 

    %if the variable is empty then make the link to the original openvar 
    if isempty(openVarHandle) 
     openVarHandle = @openvar; 
    end 

    %no variable name passed, call was to setup connection 
    if narargin==0 
     return; 
    end 


    %get a copy of the original variable to check its size 
    tmpVar = evalin('base', x);   

    %if the variable is big and the user doesn't click yes then return 
    if prod(size(tmpVar)) > maxVarSize 
     resp = questdlg(sprintf('Variable %s is very large, open anyway?', x)); 
     if ~strcmp(resp, 'Yes') 
      return; 
     end 
    end 

    if ischar(x) && ~isempty(openVarHandle); 
     openVarHandle(x); 
    end 
end 

Khi chức năng này được xác định sau đó bạn chỉ cần thực hiện một kịch bản mà

  • Xóa bất kỳ biến tên openvar
  • chạy kịch bản openVarWrapper để thiết lập kết nối
  • điểm gốc openVar để openVarWrapper

Ví dụ Script:

clear openvar; 
openVarWrapper; 
openvar = @openVarWrapper; 

Cuối cùng khi bạn muốn để làm sạch tất cả mọi thứ lên bạn chỉ có thể gọi:

clear openvar; 
+0

nó sẽ dễ dàng hơn để có được xử lý cho các chức năng bóng, chỉ từ filepath được chính xác. Giải pháp của bạn yêu cầu một số khởi tạo (mỗi khi bạn sử dụng 'xóa tất cả'). [Giải pháp của tôi] (http://stackoverflow.com/a/11781650/1162609) yêu cầu cd'ing đến đường dẫn và trở lại, nhưng đó là tất cả các hackery. Tôi vẫn hy vọng một người nào đó đến với một cách tốt hơn: p –

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