Tôi muốn thực hiện một số phản ánh khá nặng trong Ruby. Tôi muốn tạo ra một chức năng trả về tên của các đối số của các chức năng gọi khác nhau cao hơn ngăn xếp cuộc gọi (chỉ một cao hơn sẽ là đủ nhưng tại sao dừng lại ở đó?). Tôi có thể sử dụng Kernel.caller
, chuyển đến tệp và phân tích cú pháp danh sách đối số nhưng điều đó sẽ rất xấu và không đáng tin cậy.Cách lấy tên đối số bằng cách sử dụng sự phản chiếu
Chức năng mà tôi muốn sẽ làm việc theo cách sau:
module A
def method1(tuti, fruity)
foo
end
def method2(bim, bam, boom)
foo
end
def foo
print caller_args[1].join(",") #the "1" mean one step up the call stack
end
end
A.method1
#prints "tuti,fruity"
A.method2
#prints "bim, bam, boom"
tôi sẽ không quan tâm sử dụng ParseTree hoặc một số công cụ tương tự cho công việc này nhưng nhìn vào cây phân tích cú pháp, nó không phải là rõ ràng làm thế nào để sử dụng nó vì mục đích này. Tạo một phần mở rộng C như this là một khả năng khác nhưng nó sẽ là tốt đẹp nếu ai đó đã làm nó cho tôi.
Tôi có thể thấy rằng có thể tôi sẽ cần một số loại tiện ích mở rộng C. Tôi cho rằng điều đó có nghĩa là câu hỏi của tôi là sự kết hợp của phần mở rộng C sẽ làm việc dễ dàng nhất. Tôi không nghĩ rằng người gọi + ParseTree sẽ là đủ của mình. Theo như lý do tại sao tôi muốn làm điều này, thay vì nói "gỡ lỗi tự động", có lẽ tôi nên nói rằng tôi muốn sử dụng chức năng này để tự động kiểm tra các điều kiện gọi và trả lại các chức năng:
def add x, y
check_positive
return x + y
end
Trường hợp check_positive
sẽ ném một ngoại lệ nếu x
và y
không dương. Rõ ràng, sẽ có nhiều điều hơn thế nhưng hy vọng điều này mang lại đủ động lực.
Dường như bạn muốn xác định thứ tự thực hiện và lập luận. Có lý do nào mà bạn không thể sử dụng tính năng ghi nhật ký không? Bạn thậm chí có thể làm một số metaprogramming để mở tất cả các phương thức trong lớp và tự động đăng nhập các đối số để làm những gì bạn muốn. – runako