2013-02-01 24 views
5

Tôi thích sử dụng cell mode thay vì phá vỡ các điểm khi viết/gỡ lỗi chức năng.Cách xác định xem mã có được thực hiện như một chức năng hay sử dụng chế độ di động

Bạn sẽ xác định thời gian chạy như thế nào nếu mã thực hiện hiện đang được thực thi dưới dạng hàm hoặc sử dụng chế độ ô?

Điểm thưởng Nếu bạn có thể tìm ra số function biết rằng nó được gọi từ bên trong một hàm khác hoặc từ một ô.

Ví dụ về khi điều này có thể hữu ích là khi bạn muốn tải dữ liệu khác nhau trong khi thực thi hàm hoặc nếu bạn muốn tạo trình vẽ để gỡ lỗi. Nó sẽ trở thành một nỗi đau để bình luận ra các dòng cụ thể khi chuyển đổi giữa thực hiện như một tế bào hoặc một chức năng.

function doSomethingAwesome(inputs) 
%% 

if executingAsCell == true 
    clear 
    importData 
end 


% process stuff 

if executingAsCell == true 
    plot(myAwesomeResults) 
end 

Lưu ý, đây không phải là một bản sao của câu hỏi trước đây của tôi:How to determine if code is executing as a script or function?

+0

+1 Câu hỏi thú vị. Đầu tiên nghĩ (hack xấu xí): những gì về việc xác định một biến giả như điều đầu tiên bạn làm trong chức năng của bạn/kịch bản và sau đó kiểm tra xem nó được xác định? – user1884905

+3

Bạn có thể làm điều này với [dbstack] (http://www.mathworks.nl/help/matlab/ref/dbstack.html), không chắc chắn. – Junuxx

Trả lời

2

Phương pháp đơn giản nhất là sử dụng dbstack() theo đề nghị của @Junuxx:

if isempty(dbstack) 
    %# true if you evaluated the cell while not in debug mode 

Tương tự như vậy, một hàm có thể biết liệu nó được gọi từ một hàm khác hay từ cơ sở/ô bằng cách kiểm tra chiều dài của dbstack

function doSomething 
    if length(dbstack)==1 
     %# the function has been invoked from a cell or the command line 
     %# (unless you're in debug mode) 

Một chức năng thực sự có thể phân biệt cho dù nó được gọi từ dòng lệnh hoặc từ một tế bào, vì sau này không ghi vào lịch sử:

function doSomething 

    if length(dbstack)==1 
     javaHistory=com.mathworks.mlservices.MLCommandHistoryServices.getSessionHistory; 
     lastCommand = javaHistory(end).toCharArray'; % ' added for SO code highlighting 
     if strfind(lastCommand,'doSomething') 
     %# Probably invoked via command line 
     else 
     %# Probably invoked via executing a cell 

Nếu bạn muốn xác định xem bạn trong chế độ gỡ lỗi hay không, một khả năng là sử dụng line -giá trị từ dbstack, và kiểm tra xem có một cuộc gọi đến chức năng hiện đang thực hiện trên dòng chức năng gọi rõ ràng.

+0

@Slayton: Cảm ơn bạn đã chỉnh sửa. Vì tôi sử dụng usercript do Amro cung cấp (xem tag wiki), tôi không còn gặp vấn đề về làm nổi bật mã nữa – Jonas

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