কীওয়ার্ড তালিকাগুলির সুবিধা কী?


101

ইলিক্সারে আমাদের মানচিত্র রয়েছে:

> map = %{:a => "one", :b => "two"} # = %{a: "one", b: "two"}
> map.a                             # = "one"
> map[:a]                           # = "one"

আমাদের কীওয়ার্ড তালিকাগুলিও রয়েছে:

> kl = [a: "one", b: "two"]       # = [a: "one", b: "two"]
> kl2 = [{:a, "one"},{:b, "two"}] # = [a: "one", b: "two"]
> kl == kl2                       # = true
> kl[:a]                          # = "one"
> kl.a                            # = ** (ArgumentError)

দুজনেই কেন?

বাক্য গঠন? এটি কি কারণ কীওয়ার্ড তালিকাগুলিতে আরও নমনীয় সিনট্যাক্স রয়েছে যা তাদের কোঁকড়া ছাড়া এবং এমনকি বন্ধনী ছাড়াই কোনও ফাংশন কলের শেষ প্যারাম হিসাবে সংজ্ঞায়িত করা যায়? তাহলে মানচিত্রগুলিকে এই সিনট্যাকটিক চিনি দিচ্ছেন না কেন?

নকল কী? মূলশব্দ তালিকাগুলিতে নকল কী থাকতে পারে বলেই এটি? আপনি উভয় মানচিত্রের স্টাইল অ্যাক্সেস এবং নকল কীগুলি চান?

কর্মক্ষমতা? কীওয়ার্ড তালিকাগুলির আরও ভাল পারফরম্যান্স হওয়ার কারণে এটি? তাহলে মানচিত্র কেন? এবং মানচিত্রগুলি টিউপসগুলির তালিকার চেয়ে কী দ্বারা সদস্যদের সন্ধানে আরও পারফরম্যান্স হওয়া উচিত নয়?

জেএস অ্যারে এবং রুবি হ্যাশের চেহারা কেমন? এইটাই কি সেইটা?

আমি বুঝতে পারি যে কাঠামোগতভাবে এগুলি বিভিন্ন উপাত্তের উপস্থাপনা। আমার কাছে মনে হচ্ছে এলিক্সারে কীওয়ার্ড তালিকাগুলি ব্যতিক্রমী সিনট্যাক্স (3 টি আলাদা সিনট্যাক্টিক ভেরিয়েন্ট) এর মাধ্যমে ভাষাটিকে জটিল করে তোলে, মানচিত্রের সাথে কেস ওভারল্যাপ ব্যবহার করে এবং একটি অস্পষ্ট সুবিধা।

কীওয়ার্ড তালিকাগুলি ব্যবহার করে কী লাভ?

উত্তর:


143
                   ┌──────────────┬────────────┬───────────────────────┐
                   │ Keyword List │ Map/Struct │ HashDict (deprecated) │
┌──────────────────┼──────────────┼────────────┼───────────────────────┤
│ Duplicate keys   │ yes          │ no         │ no                    │
│ Ordered          │ yes          │ no         │ no                    │
│ Pattern matching │ yes          │ yes        │ no                    │
│ Performance¹     │ —            │ —          │ —                     │
│ ├ Insert         │ very fast²   │ fast³      │ fast⁴                 │
│ └ Access         │ slow⁵        │ fast³      │ fast⁴                 │
└──────────────────┴──────────────┴────────────┴───────────────────────┘

কীওয়ার্ডের তালিকা হালকা ওজনের এবং এগুলির নীচে একটি সাধারণ কাঠামো রয়েছে যা এগুলি খুব নমনীয় করে তোলে। আপনি এড়লং কনভেনশনের শীর্ষে তাদের সিনট্যাক্স চিনির মতো ভাবতে পারেন, খুব কুরুচিপূর্ণ কোড না লিখে এরলংয়ের সাথে ইন্টারফেস করা সহজ করে তোলে। উদাহরণস্বরূপ, কীওয়ার্ড তালিকাগুলি ফাংশন আর্গুমেন্টগুলির প্রতিনিধিত্ব করতে ব্যবহৃত হয়, যা এলাং থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সম্পত্তি। কিছু ক্ষেত্রে, কীওয়ার্ড তালিকাগুলি আপনার একমাত্র পছন্দ, বিশেষত যদি আপনার ডুপ্লিকেট কী বা অর্ডার দেওয়ার প্রয়োজন হয়। অন্যান্য বিকল্পগুলির তুলনায় এগুলির সহজলভ্য বৈশিষ্ট্য রয়েছে যা এগুলি কিছু পরিস্থিতিতে উপযোগী করে তোলে এবং অন্যদের জন্য কম করে।

মানচিত্র (এবং স্ট্রাক্টস) প্রকৃত পে-লোড ডেটা সঞ্চয় করার জন্য ব্যবহৃত হয়, কারণ তাদের একটি হ্যাশ-ভিত্তিক বাস্তবায়ন রয়েছে। কীওয়ার্ড তালিকাগুলি অভ্যন্তরীণভাবে কেবলমাত্র তালিকাগুলি যা প্রতিটি ক্রিয়াকলাপের জন্য ট্র্যাভার্স করা দরকার, তাই ধ্রুবক সময় অ্যাক্সেসের মতো ক্লাসিক কী-মান ডেটা স্ট্রাকচারের বৈশিষ্ট্য তাদের নেই।

এলিক্সির লেখার সময় মানচিত্রের দুর্বল পারফরম্যান্সেরHashDict জন্য একটি কর্মসীমা হিসাবে পরিচয়ও দিয়েছিল । যাইহোক, এটি এখন এলিক্সির 1.0.5 / এরলং 18.0 হিসাবে ঠিক করা হয়েছে এবং ভবিষ্যতের সংস্করণগুলিতে হ্রাস করা হবেHashDict

আপনি যদি এরলং স্ট্যান্ডার্ড লাইব্রেরির আরও গভীর খনন করেন, এমন আরও অনেক ডেটা স্ট্রাকচার রয়েছে যা কী / মান জোড়া সংরক্ষণ করে:

আপনার একাধিক প্রক্রিয়া এবং / অথবা ভিএম জুড়ে কী / মান জোড় সংরক্ষণ করতে হবে যখন আপনার এই বিকল্পগুলিও রয়েছে:

  • ets / dets - (ডিস্ক ভিত্তিক) এরলং টার্ম স্টোরেজ
  • মেনেসিয়া - বিতরণ ডাটাবেস

¹ সাধারণভাবে বলতে গেলে, তবে অবশ্যই এটি নির্ভর করে

² সেরা কেস কেবল একটি তালিকার জন্য প্রস্তুত।

Eli এলিক্সির ০.০.৫ বা তার বেশি বয়সীদের ক্ষেত্রে প্রযোজ্য, পুরানো সংস্করণগুলিতে ধীর হতে পারে।

HashDictএখন হ্রাস করা হচ্ছে।

A একটি রৈখিক অনুসন্ধান প্রয়োজন যা গড়ের অর্ধেক উপাদানকে স্ক্যান করে।


1
সদৃশ কীগুলি মঞ্জুরি দেওয়া এবং অর্ডার করা সুবিধাগুলি নয়, বিভিন্ন বৈশিষ্ট্য। আপনার প্রয়োজনীয়তার সাথে খাপ খায় এমন ডাটা স্ট্রাকচার বেছে নিতে হবে।
ডানফোল্ড

2
কড়া কথা বললে, হ্যাঁ, তবে আপনার যদি সেই সম্পত্তিগুলির প্রয়োজন হয় তবে তারা উপকার হতে পারে - এটাই আমি বোঝাতে চাইছিলাম।
প্যাট্রিক অসিটি

@ পেট্রিকঅ্যাসিটি: এ জাতীয় ক্ষেত্রে অবশ্যই তাদের প্রয়োজন অনুসারে আরও শ্রেণিবদ্ধ করা হবে ?
অরবিটে

11
@ গ্রেগ্রেগ কীওয়ার্ড তালিকাগুলি থাকার আরও একটি অন্তর্নিহিত সুবিধা রয়েছে: আমরা কাঠামোগত এবং অ-কাঠামোগত ডেটা সম্পর্কে আলাদা করে ফেলি। কীগুলি কীওয়ার্ড এবং কীওয়ার্ডের নেই সেগুলি দিয়ে কাঠামোগত ডেটার জন্য মানচিত্রগুলি অত্যন্ত কার্যকর। আজ, মানচিত্রের বেশিরভাগ ব্যবহার কাঠামোগত ডেটার জন্য এবং আমরা keywordsচ্ছিকগুলির জন্য কীওয়ার্ড রেখে দিই। আমাদের যদি কেবল মানচিত্র থাকে তবে আমি মনে করি এই পার্থক্যের একটি ভাল অংশ হারাবে।
জোসে ভালিম

1
প্রকৃতপক্ষে এটি হয়েছিল, মানচিত্রগুলি 18 এরং থেকে যাওয়ার উপায়
পাপিপো

12

মূলশব্দ তালিকার প্রধান সুবিধা হ'ল বিদ্যমান ইলিক্সির এবং এরলং কোডবেসের সাথে একটি পশ্চাদপটে সামঞ্জস্য।

তারা যেমন সিন্থ্যাক্স চিনির যোগ করে যদি ফাংশন আর্গুমেন্ট হিসাবে ব্যবহার করা হয় যা উদাহরণস্বরূপ রুবি সিনট্যাক্সের সাথে সাদৃশ্যপূর্ণ:

def some_fun(arg, opts \\ []), do: ...
some_fun arg, opt1: 1, opt2: 2

কীওয়ার্ড তালিকাগুলি ব্যবহারের প্রধান অপূর্ণতা হ'ল এটিগুলির সাথে আংশিক প্যাটার্নটি মিলে যাওয়া সম্ভব নয়:

iex(1)> m = %{a: 1, b: 2}
%{a: 1, b: 2}
iex(2)> %{a: a} = m
%{a: 1, b: 2}
iex(3)> a
1
iex(4)> k = [a: 1, b: 2]
[a: 1, b: 2]
iex(5)> [a: a] = k
** (MatchError) no match of right hand side value: [a: 1, b: 2]

আসুন এটি আর্গুমেন্ট ফাংশন প্রসারিত করুন। কল্পনা করুন যে আমাদের বিকল্পগুলির একটির মানের ভিত্তিতে একটি বহুবিধ ফাংশন পরিচালনা করতে হবে:

def fun1(arg, opt1: opt1) when is_nil(opt1), do: do_special_thing
def fun1(arg, opts), do: do_regular_thing

def fun2(arg, %{opt1: opt1}) when is_nil(opt1), do: do_special_thing
def fun2(arg, opts), do: do_regular_thing

এটি কখনই কার্যকর করবে না do_special_thing:

fun1("arg", opt1: nil, opt2: "some value")
doing regular thing  

মানচিত্র যুক্তি দিয়ে এটি কাজ করবে:

fun2("arg", %{opt1: nil, opt2: "some value"})
doing special thing

2

মানচিত্র নির্দিষ্ট কীটির জন্য কেবল একটি প্রবেশের অনুমতি দেয়, যেখানে কীওয়ার্ড তালিকাগুলি কী পুনরাবৃত্তি করার অনুমতি দেয়। মানচিত্রগুলি দক্ষ (বিশেষত তারা বাড়ার সাথে সাথে) এবং এগুলি এলিক্সিরের প্যাটার্ন মেলাতে ব্যবহার করা যেতে পারে।

সাধারণভাবে, কমান্ড-লাইন প্যারামিটার এবং বিকল্পগুলি পাশ করার জন্য কীওয়ার্ড তালিকাগুলি ব্যবহার করুন এবং আপনি যখন কোনও এসোসিয়েটিভ অ্যারে চান তখন মানচিত্র (বা অন্য কোনও ডেটা স্ট্রাকচার, হ্যাশডিক্ট) ব্যবহার করুন।

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