এটা একটি মজার প্রশ্ন। মূল প্রশ্নটি হ'ল প্রকার হিসাবে ঘোষিত হিসাবে আমরা কী সংজ্ঞায়িত করি । যদি আপনি বোঝাতে চান যে ::SomeType
প্রতিটি পদ্ধতির সংজ্ঞায় একটি বিবৃতি রয়েছে তবে জুলিয়াতে আপনার গতিশীল কোড তৈরির বিভিন্ন সম্ভাবনা রয়েছে বলে এটি করা কিছুটা জটিল। সম্ভবত এই অর্থে একটি সম্পূর্ণ সমাধান আছে তবে আমি এটি জানি না (আমি এটি শিখতে পছন্দ করব)।
আমার মনে যে জিনিসটি আসে তবে তা অপেক্ষাকৃত সহজ বলে মনে হয় কোনও মডিউলের মধ্যে সংজ্ঞায়িত কোনও পদ্ধতি Any
তার যুক্তি হিসাবে গ্রহণ করে কিনা তা পরীক্ষা করা । এটি অনুরূপ তবে আগের বিবৃতিটির সমতুল্য নয়:
julia> z1(x::Any) = 1
z1 (generic function with 1 method)
julia> z2(x) = 1
z2 (generic function with 1 method)
julia> methods(z1)
# 1 method for generic function "z1":
[1] z1(x) in Main at REPL[1]:1
julia> methods(z2)
# 1 method for generic function "z2":
[1] z2(x) in Main at REPL[2]:1
methods
উভয় ফাংশনের স্বাক্ষর x
হিসাবে গ্রহণ হিসাবে ফাংশন জন্য একই চেহারা Any
।
এখন কোনও মডিউল / প্যাকেজের Any
কোনও পদ্ধতিতে এটি সংজ্ঞায়িত কোনও পদ্ধতির আর্গুমেন্ট হিসাবে গ্রহণ করে কিনা তা যাচাই করতে নীচের কোডটির মতো কিছু ব্যবহার করা যেতে পারে (আমি কেবল এটি লিখে রেখেছি বলে আমি এটির ব্যাপকভাবে পরীক্ষা করে দেখিনি, তবে এটি বেশিরভাগ ক্ষেত্রে মনে হয় সম্ভাব্য কেসগুলি কভার করুন):
function check_declared(m::Module, f::Function)
for mf in methods(f).ms
if mf.module == m
if mf.sig isa UnionAll
b = mf.sig.body
else
b = mf.sig
end
x = getfield(b, 3)
for i in 2:length(x)
if x[i] == Any
println(mf)
break
end
end
end
end
end
function check_declared(m::Module)
for n in names(m)
try
f = m.eval(n)
if f isa Function
check_declared(m, f)
end
catch
# modules sometimes return names that cannot be evaluated in their scope
end
end
end
এখন আপনি এটি Base.Iterators
মডিউলে চালালে আপনি পাবেন:
julia> check_declared(Iterators)
cycle(xs) in Base.Iterators at iterators.jl:672
drop(xs, n::Integer) in Base.Iterators at iterators.jl:628
enumerate(iter) in Base.Iterators at iterators.jl:133
flatten(itr) in Base.Iterators at iterators.jl:869
repeated(x) in Base.Iterators at iterators.jl:694
repeated(x, n::Integer) in Base.Iterators at iterators.jl:714
rest(itr::Base.Iterators.Rest, state) in Base.Iterators at iterators.jl:465
rest(itr) in Base.Iterators at iterators.jl:466
rest(itr, state) in Base.Iterators at iterators.jl:464
take(xs, n::Integer) in Base.Iterators at iterators.jl:572
এবং যখন আপনি উদাহরণস্বরূপ DataStructures.jl প্যাকেজটি পরীক্ষা করুন:
julia> check_declared(DataStructures)
compare(c::DataStructures.LessThan, x, y) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\heaps.jl:66
compare(c::DataStructures.GreaterThan, x, y) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\heaps.jl:67
cons(h, t::LinkedList{T}) where T in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\list.jl:13
dec!(ct::Accumulator, x, a::Number) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\accumulator.jl:86
dequeue!(pq::PriorityQueue, key) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\priorityqueue.jl:288
dequeue_pair!(pq::PriorityQueue, key) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\priorityqueue.jl:328
enqueue!(s::Queue, x) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\queue.jl:28
findkey(t::DataStructures.BalancedTree23, k) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\balanced_tree.jl:277
findkey(m::SortedDict, k_) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\sorted_dict.jl:245
findkey(m::SortedSet, k_) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\sorted_set.jl:91
heappush!(xs::AbstractArray, x) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\heaps\arrays_as_heaps.jl:71
heappush!(xs::AbstractArray, x, o::Base.Order.Ordering) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\heaps\arrays_as_heaps.jl:71
inc!(ct::Accumulator, x, a::Number) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\accumulator.jl:68
incdec!(ft::FenwickTree{T}, left::Integer, right::Integer, val) where T in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\fenwick.jl:64
nil(T) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\list.jl:15
nlargest(acc::Accumulator, n) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\accumulator.jl:161
nsmallest(acc::Accumulator, n) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\accumulator.jl:175
reset!(ct::Accumulator{#s14,V} where #s14, x) where V in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\accumulator.jl:131
searchequalrange(m::SortedMultiDict, k_) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\sorted_multi_dict.jl:226
searchsortedafter(m::Union{SortedDict, SortedMultiDict, SortedSet}, k_) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\tokens2.jl:154
sizehint!(d::RobinDict, newsz) in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\robin_dict.jl:231
update!(h::MutableBinaryHeap{T,Comp} where Comp, i::Int64, v) where T in DataStructures at D:\AppData\.julia\packages\DataStructures\iymwN\src\heaps\mutable_binary_heap.jl:250
আমি যা প্রস্তাব করি তা আপনার প্রশ্নের সম্পূর্ণ সমাধান নয় তবে আমি এটি নিজের জন্য দরকারী বলেই এটি ভাগ করে নেওয়ার কথা ভেবেছিলাম।
সম্পাদনা
উপরের কোডটি কেবলমাত্র f
হিসাবে গ্রহণ করে Function
। সাধারণভাবে আপনি কল করতে পারেন এমন ধরনের থাকতে পারে। তারপরে check_declared(m::Module, f::Function)
স্বাক্ষরটি পরিবর্তিত হতে পারে check_declared(m::Module, f)
(আসলে তখন ফাংশনটি নিজেই Any
দ্বিতীয় যুক্তি হিসাবে মঞ্জুরি দেয় :)) এবং সমস্ত মূল্যবান নাম এই ফাংশনে পাস করে pass তারপরে আপনাকে পরীক্ষা করতে হবে যে ফাংশনের অভ্যন্তরে methods(f)
ইতিবাচক length
আছে কি না ( methods
অ-কলযোগ্যরা দৈর্ঘ্যের মানটি দেয় 0
)।
hasmethod(f, (Any,) )
ফিরে আসবেfalse
। আপনাকে এখনও আর্গুমেন্টের সংখ্যার সাথে মিল রাখতে হবে (অর্থাত্hasmethod(f, (Any,Any) )
একটি দ্বি-যুক্তি ফাংশনের জন্য)।