কম্পিউটার টিউটোরিয়াল

রুবি সি এক্সটেনশনে মাস্টারিং আর্গুমেন্ট পার্সিং:একটি ধাপে ধাপে নির্দেশিকা

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

এই কারণে, রুবির আর্গুমেন্টগুলি খুব নমনীয়, যা আমাদের APIগুলিকে খুব স্পষ্টভাবে প্রকাশ করতে দেয়। কিন্তু এটি একটি অপূর্ণতা নিয়ে আসে:Cextension বিকাশকারীদের জন্য রুবি পার্স করা বেশ কঠিন!

এই নিবন্ধে, আমরা একটি জটিল রুবি API সেট আপ করার দুটি উপায়ের মধ্য দিয়ে যাব যা C এ লেখা আছে:

  • rb_define_method সহ এবং rb_scan_args দিয়ে পার্স করা হচ্ছে
  • রুবি ইন্টারফেস ব্যবহার করে

চলুন শুরু করা যাক!

C এবং রুবি:একটি ভূমিকা

যেমন উল্লেখ করা হয়েছে, রুবি সি এক্সটেনশন ডেভেলপারদের জন্য পার্স করা কঠিন।

যেমন:

 

C-এর সৌন্দর্য, রুবি যে ভাষায় লেখা হয়েছে, এর সরলতা থেকে উদ্ভূত হয়েছে, এর ফাংশন প্যারামিটার সহ:

  • <data-type> <variable-identifier>
  • ... বিভিন্ন যুক্তির জন্য।

এগুলি আপনাকে অ্যাকোডবেস বজায় রাখতে সাহায্য করবে যা বোঝা খুব কঠিন নয়৷

একটি C ফাংশন সংজ্ঞায়িত করার সবচেয়ে জটিল উপায় এখানে:

 

যখন আপনি আপনার রুবি কোডবেসের জন্য একটি সি এক্সটেনশন কোড করেন, তখন আপনি বুঝতে শুরু করবেন জটিলতা কোথায় শুরু হয়। কিন্তু চিন্তা করবেন না — রুবি এমআরআই ডেভেলপাররা আমাদের কভার করেছেন।

রুবি সি এক্সটেনশনে সহজ পদ্ধতির সংজ্ঞা

আমরা একটি পদ্ধতি দিয়ে শুরু করব যা আপনাকে কিছু সময়ে ব্যবহার করতে হবে, rb_define_method .

আপনি এই রেপোতে কোড উদাহরণ সহ অনুসরণ করতে পারেন।

এখানে rb_define_method এর স্বাক্ষর:

 

এবং রুবির extension.rdoc অনুযায়ী:

argc হল আর্গুমেন্টের সংখ্যা। argc -1 হলে, ফাংশনটি 3টি আর্গুমেন্ট পাবে:argc, argv এবং self। যদি argc -2 হয়, ফাংশনটি 2টি আর্গুমেন্ট পাবে, self এবং args, যেখানে args হল মেথড আর্গুমেন্টের একটি রুবি অ্যারে।

সংক্ষেপে:

 

তাই যদি আপনার এপিআই শুধুমাত্র নির্দিষ্ট প্যারামিটার দৈর্ঘ্য সহ পদ্ধতি নিয়ে থাকে, অথবা শুধুমাত্র একটি বৈচিত্র্যময় প্যারামিটার (def foo(*bar) ), আর পড়ুন না — আপনার কাজ শেষ! আপনি যদি আপনার API কল করার একটি সমৃদ্ধ উপায় চান, অনুগ্রহ করে, আমার অতিথি হোন৷

যাই হোক, আপনি যদি rb_define_method-এ আরও জড়িত উদাহরণ চান , আপনি পিটার ঝুর নিবন্ধটি সংজ্ঞায়িত পদ্ধতি পড়ার পরামর্শ দেন

রুবি সি API অভ্যন্তরীণ ব্যবহার করা

সুতরাং, আসুন আমাদের ব্যবহারের ক্ষেত্রে ফিরে যাই:জটিল আর্গুমেন্ট পার্সিং। সৌভাগ্যবশত, কিছু টুল আমাদের সাহায্য করতে পারে।

কিন্তু প্রথমে, আসুন শুধুমাত্র rb_define_method ব্যবহার করার সীমাবদ্ধতা দেখি .

rb_define_method এর অপূর্ণতা

ব্লক আর্গুমেন্টের কোন উল্লেখ নেই

একটি সীমাবদ্ধতা হল rb_define_method ব্লক আর্গুমেন্ট উল্লেখ না. সেগুলি বিবেচনা করা হয় না, কারণ আপনি যদি পাসা ব্লক করেন তবে রুবির কাছে এটি আসলেই কোন ব্যাপার না। আপনি এখনও নিশ্চিত করতে পারেন যে rb_block_given_p ব্যবহার করে একটি ব্লক পাস হয়েছে অথবা rb_need_block . পিটার ঝুর নিবন্ধে এই বিষয়ে আরও কিছু আছে।

আর্গগুলি পরিবর্তিত হতে পারে

আরেকটি গুরুত্বপূর্ণ সীমাবদ্ধতা হল args পরিবর্তিত হতে পারে, কিন্তু মেথডকল নিজেই এতটা সীমাবদ্ধ নয়। অতএব, আপনি যদি চান আপনার API def foo(bar, *baz) এর মত হোক , আপনাকে আপনার আর্গুমেন্ট পার্স করতে হবে। সেই পথে আপনাকে সাহায্য করার জন্য কয়েকটি পদ্ধতি রয়েছে। rb_check_arity আপনি rb_define_method এর -1 সংস্করণ সহ ব্যবহার করতে পারেন .

এখানে ফাংশন স্বাক্ষর:

 

কীওয়ার্ড আর্গুমেন্টস

একটি শেষ সীমাবদ্ধতা যা আমরা অতিক্রম করব তা হল কীওয়ার্ড আর্গুমেন্টের ব্যবহার৷ এবং আমি শেষের জন্য সেরাটি রেখেছি, কারণ এটিই হবে এই নিবন্ধের মূল৷

সঠিকভাবে পার্স করার আগে আমাদের কীওয়ার্ড আর্গুমেন্ট পুনরুদ্ধার করতে হবে। সৌভাগ্যবশত, Ruby C API এর জন্য একটি পদ্ধতি নিয়ে আসে,rb_scan_args .

এখানে rb_scan_args স্বাক্ষর:

 

আপনি rb_scan_args পাস করেছেন argc এবং argv rb_define_method দ্বারা প্রদত্ত — একটি স্ট্রিং যা বলে যে আর্গুমেন্টগুলি কীভাবে পার্স করা উচিত (fmt ) এবং সেই আর্গুমেন্টের জন্য রিসিভার। সেখানে আপনি যান, রুবির সমস্ত আর্গস জটিলতা এক লাইনে পার্স করা হয়েছে! ঠিক আছে, প্রায়।

কিভাবে fmt একটি আনুষ্ঠানিক উপস্থাপনা জন্য আপনি extension.rdoc উল্লেখ করতে পারেন লেখা উচিত, যদিও আমরা আংশিকভাবে নীচের উদাহরণগুলিতে এটি কভার করব।

একটি ফাংশন লিখুন এবং পার্স করুন:একটি উদাহরণ

এই নিবন্ধের বাকি অংশের জন্য, আসুন বিবেচনা করি যে আমরা এই ফাংশনটি লিখতে চাই:

 

rb_scan_args ব্যবহার করে এটি পার্স করা হচ্ছে এই মত দেখাবে:

 

"1*:" গিবেরিশ মানে:

  • 1 :একটি প্রয়োজনীয় অবস্থানগত যুক্তি
  • * :যেকোনো পরিমাণ অবস্থানগত যুক্তি প্রয়োজন নেই
  • : :শেষে কীওয়ার্ড আর্গুমেন্ট

কীওয়ার্ড আর্গুমেন্ট পার্স করুন

এখন আমরা পদ্ধতিটি সীমাবদ্ধ করেছি, দুর্ভাগ্যবশত, আমরা এখনও সম্পন্ন করিনি। আমাদের বর্তমান API হল def voronoi_diagram(envelope, *polygons, **kwargs) .

অবশেষে, rb_get_kwargs ব্যবহার করে সেই কীওয়ার্ড আর্গুমেন্টগুলিকে পার্স করতে হবে .

 

আপনাকে কিছু প্রয়োজনীয় এবং ঐচ্ছিক আর্গুমেন্ট বেছে নিতে হবে। এটি হয়ে গেলে, আপনি table ব্যবহার করুন রুবিকে সেই আর্গুমেন্টগুলির নাম বলতে, এবং আপনি ফলাফলটি একটি অ্যারেতে সংরক্ষণ করেন (values )।

 

সেখানে আপনি এটা আছে! একটি জটিল রুবি পদ্ধতি, শুধুমাত্র C ব্যবহার করে পার্স করা হয়েছে। যাইহোক, যদি এটি আপনার জন্য খুব জটিল হয়, তবে আরেকটি বিকল্প আছে।

রুবি ইন্টারফেস ব্যবহার করা

সমস্যাটি পরিচালনা করার আরেকটি উপায় হল রুবির সিনট্যাক্স সরাসরি ব্যবহার করা এবং রুবি পর্যায়ে পার্সিং করা।

 

এটি দিয়ে, আপনি সরাসরি rb_define_method-এর তৃতীয় ফর্মটি ব্যবহার করতে পারেন , একটি C পদ্ধতির জন্য যা এইরকম দেখায়:

 

এবং আপনি সেখানে যান — আপনি একটি মার্জিত সমাধানের সাথে সমস্যাটি সম্পূর্ণভাবে এড়াতে পারেন যা আসলে রুবি ইমপ্লিমেন্টেশনের কিছু পদ্ধতির জন্য ব্যবহৃত হয় (Primitive সহ ক্লাস)।

যদিও এমআরআই দ্বারা ব্যবহৃত ক্লাসটি বেশ জটিল এবং এটি নিজেই সি তৈরি করে, আমরা এটি দ্বারা অনুপ্রাণিত হতে পারি৷

আসুন একটি বস্তু তৈরি করি এবং দৃশ্যমান c_voronoi_diagram এড়াতে আমাদের পদ্ধতিগুলি প্লাগ করি আমাদের API ব্যবহারকারীদের জন্য:

 
 

RGeo এর কোডবেসে এই শ্রেণীর একটি বাস্তব ব্যবহারের ক্ষেত্রে দেখুন।

পার্সিং আর্গুমেন্ট:আমি কোন পদ্ধতি ব্যবহার করব?

এই রেপোটি একটি জটিল রুবি API সেট আপ করার দুটি উপায় দেখায় যা C তে লেখা আছে — পুনঃকরণ করার জন্য:

  • rb_define_method সহ এবং এটিকে rb_scan_args দিয়ে পার্স করা হচ্ছে
  • রুবি ইন্টারফেস ব্যবহার করে

যখন আমরা পারফরম্যান্সের পরিপ্রেক্ষিতে উভয় সমাধানের তুলনা করি, তখন তারা মোটামুটি সমান (রুবি পার্সিং আমার M1-এ গড়ে 1.02 গুণ দ্রুত)। এটা খুব একটা পার্থক্য করে না।

RGeo lib-এ, আমাদের প্রথম ডিজাইন পছন্দ ছিল এমন একটি API থাকা যা শুধুমাত্র বৈচিত্র্যময় দৈর্ঘ্যের আর্গুমেন্ট ব্যবহার করে। কোন কীওয়ার্ড নেই, কোন ব্লক নেই। এটি অনেক সীমাবদ্ধ হতে পারে, এবং আমরা এখন Primitive ব্যবহার করছি আরও জটিল আর্গুমেন্টের অনুমতি দেওয়ার উপায়।

রুবি ইন্টারফেস ব্যবহার করার সুবিধাগুলি

আমার পরামর্শ হল একাধিক কারণে রুবি ইন্টারফেস ব্যবহার করা, যার মধ্যে রয়েছে:

  • কোডের আকার ছোট
  • পরিবর্তন করা সহজ

সামগ্রিকভাবে, এটি আপনার কোডবেস পড়ার অভিজ্ঞতাকে সহজ করে তোলে।

রুবি ব্যবহারকারীদের তারা যে রত্ন ব্যবহার করে তার সোর্স কোড পড়ার জন্য জড়িত করা আমার জন্য গুরুত্বপূর্ণ। যেমন রুবি পড়া সহজ , রত্নগুলিও হওয়া উচিত৷

rb_define_method ব্যবহারের সুবিধা

C সংস্করণ, তবে, আমাদের কিছু খুব দরকারী অভ্যন্তরীণ পদ্ধতির স্বাদ দেয়। উদাহরণস্বরূপ, rb_check_arity এখনও সত্যিই দরকারী। ব্লকগুলি হ্যান্ডলিং করার পদ্ধতিগুলিও দুর্দান্ত, এবং আপনাকে ব্লকগুলির জন্য রুবি সম্মুখভাগ ব্যবহার করার প্রয়োজন নাও হতে পারে৷

এটি আপনার ব্যবহারের ক্ষেত্রে সর্বোত্তম পছন্দ খোঁজার বিষয়ে।

র্যাপিং আপ

এই পোস্টে, আমরা আপনার রুবি সি এক্সটেনশনে আর্গুমেন্ট পার্স করার দুটি পদ্ধতি অনুসন্ধান করেছি — rb_define_method ব্যবহার করে (এছাড়াও এর সীমাবদ্ধতার দিকে সংক্ষেপে তাকিয়ে) এবং এটিকে rb_scan_args দিয়ে পার্স করা এবং একটি রুবি ইন্টারফেস ব্যবহার করে৷

আপনি যদি C এক্সটেনশন সম্পর্কে আরও পড়তে চান, আমি সুপারিশ করি:

  • স্ক্র্যাচ থেকে একটি রুবি সি এক্সটেনশন তৈরি করা
  • সি-সাইড বরাবর একটি রুবিস্টের হাঁটা
  • ম্যাকে রুবি সি এক্সটেনশনের সাথে কাজ করা

এবং আপনার জন্য আমার পরামর্শের চূড়ান্ত শব্দ:RGeo দেখুন। এটি সক্রিয় বিকাশে একটি বহুল ব্যবহৃত সি এক্সটেনশন কোডবেস। আমার বেশিরভাগ উদাহরণ এখান থেকে আসে।

শুভ কোডিং!

পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্ট মিস করবেন না!

রুবি সি এক্সটেনশনে মাস্টারিং আর্গুমেন্ট পার্সিং:একটি ধাপে ধাপে নির্দেশিকা

Ulysse Buonomo

আমাদের অতিথি লেখক ইউলিস একজন প্রাক্তন ইন্ডাস্ট্রি রুবি ডেভেলপার যিনি তার বেশিরভাগ সময় সারা বিশ্বে ভ্রমণের জন্য উৎসর্গ করেন। তার অবসর সময় আরজিও এবং রুবিকে উৎসর্গ করা হয় এবং তিনি রুবির অভ্যন্তরীণ বিষয়গুলির সাথে মিশতে পছন্দ করেন৷

Ulysse Buonomo

এর সমস্ত নিবন্ধ
  1. ম্যাটপ্লটলিবে মেরু অক্ষে প্লট স্ক্যাটার পয়েন্ট

  2. HTML DOM শৈলী লেটারস্পেসিং প্রপার্টি

  3. JavaScript symbol.valueOf() ফাংশন

  4. AWS Lambda এবং সার্ভারলেস রেডিস দ্বারা সমর্থিত নেটিভ অ্যাপ্লিকেশানগুলি তৈরি করা