স্প্ল্যাটেড কাওয়ার্গসের ক্ষেত্রের বাইরে কীওয়ার্ড আর্গুমেন্টগুলি কীভাবে পুনরুদ্ধার করব?


9

আমার মত যদি কোনও ফাংশন স্বাক্ষর থাকে তবে আমি f(args...; kwargs...)কীভাবে একটি নির্দিষ্ট কীওয়ার্ড আউট করব kwargs? সবে টাইপিং kwargs.xকাজ করে না:

julia> f(args...; kwargs...) = kwargs.x
f (generic function with 1 method)

julia> f(x=1)
ERROR: type Pairs has no field x
Stacktrace:
 [1] getproperty(::Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:x,),Tuple{Int64}}}, ::Symbol) at ./Base.jl:20
 [2] #f#7(::Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:x,),Tuple{Int64}}}, ::typeof(f)) at ./REPL[2]:1
 [3] (::var"#kw##f")(::NamedTuple{(:x,),Tuple{Int64}}, ::typeof(f)) at ./none:0
 [4] top-level scope at REPL[3]:1

এই প্রশ্নটি # হেল্পডেস্কের জুলিয়াএলং স্ল্যাক চ্যানেলে উপস্থিত হয়েছিল। খুব দরকারী জুলিয়া স্ল্যাকটিতে একটি স্বয়ংক্রিয় আমন্ত্রণের জন্য, কেবল https://slackinvite.julialang.org পূরণ করুন

উত্তর:


10

এটি হওয়ার কারণটি হ'ল স্প্ল্যাটেড কীওয়ার্ড আর্গুমেন্টগুলি ডিফল্টরূপে নামকরণিত টুপলে সংরক্ষণ করা হয় না। আমরা দেখতে পাচ্ছি যে তারা কীভাবে সঞ্চিত থাকে:

julia> g(;kwargs...) = kwargs
g (generic function with 1 method)

julia> g(a=1)
pairs(::NamedTuple) with 1 entry:
  :a => 1

julia> g(a=1) |> typeof
Base.Iterators.Pairs{Symbol,Int64,Tuple{Symbol},NamedTuple{(:a,),Tuple{Int64}}}

সুতরাং স্প্ল্যাটেড কাওয়ারগুলি পরিবর্তে কিছু ধরণের পুনরাবৃত্তকারী অবজেক্ট হিসাবে সংরক্ষণ করা হয়। যাইহোক, আমরা সহজেই সেই kwargsপুনরাবৃত্তিকারীটিকে এরকম একটি নেমডটুপলে রূপান্তর করতে পারি : (;kwargs...)এবং তারপরে আমরা যেভাবে প্রত্যাশা করব তা এটিতে অ্যাক্সেস করুন, যাতে আপনার উদাহরণটি অনুবাদ করতে পারে

julia> f(args...; kwargs...) = (;kwargs...).x
f (generic function with 1 method)

julia> f(x=1, y=2)
1

অবশ্যই, আরও মুশকিল উপায়টি এর পরিবর্তে ফাংশনটি লিখতে হবে

julia> f(args...; x, kwargs...) = x
f (generic function with 1 method)

julia> f(x=1, y=2)
1

তবে এটি ধরে নিয়েছে যে আপনি xফাংশনটি লেখার সময় আপনি যে নামটি অ্যাক্সেস করতে চান তা জানেন ।


একটি সংক্ষিপ্ত স্থান: যদি আমরা আমাদের উদাহরণটিতে ফিরে যাই তবে আমরা g(;kwargs...) = kwargsপুনরাবৃত্তিকারী অবজেক্টের ক্ষেত্রের নামগুলি অনুরোধে ফিরে আসতে চাইব:

julia> g(x=1, y=2) |> typeof |> fieldnames
(:data, :itr)

এইচএম, এই dataক্ষেত্রটি কী?

julia> g(x=1, y=2).data
(x = 1, y = 2)

আহা! সুতরাং আমরা আসলে কাওয়ারগুলি একটি নামকরণযুক্ত টিপল হিসাবে ব্যবহার করতে পারি, f(;kwargs...) = kwargs.data.xএটি কাজ করবে, তবে আমি এই পদ্ধতির সুপারিশ করব না যেহেতু এটি অনিবন্ধিত আচরণের উপর নির্ভর করে বলে মনে হয়, সুতরাং এটি কেবল একটি বাস্তবায়ন বিশদ হতে পারে যা স্থিতিশীল হওয়ার নিশ্চয়তা দেয় না জুলিয়া সংস্করণ জুড়ে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.