স্কালায় আমি কীভাবে পরিবর্তনশীল নিক্ষেপ করব?


199

প্রকারের সাথে একটি ভেরিয়েবল দেওয়া Graphics, আমি কীভাবে এটিকে Graphics2Dস্কালায় কাস্ট করব ?

উত্তর:


282

পছন্দসই কৌশলটি প্যাটার্ন মিলটি ব্যবহার করা। এই আপনি অত্যন্ত শৃঙ্খলার ক্ষেত্রে পরিচালনা করতে যে প্রশ্নে মান পারবেন না দেওয়া ধরনের:

g match {
  case g2: Graphics2D => g2
  case _ => throw new ClassCastException
}

এই ব্লকটি asInstanceOf[Graphics2D]পদ্ধতির শব্দার্থ প্রতিরূপ তৈরি করে তবে বৃহত্তর নমনীয়তার সাথে। উদাহরণস্বরূপ, আপনি বিভিন্ন ধরণের জন্য বিভিন্ন শাখা সরবরাহ করতে পারেন, কার্যকরভাবে একই সময়ে একাধিক শর্তাধীন ক্যাসেট সম্পাদন করে। সবশেষে, ক্যাচ-অল অঞ্চলে আপনার সত্যিকারের ব্যতিক্রম ছোঁড়ার দরকার নেই, আপনিও ফিরে আসতে পারেন null(বা পছন্দসই None), অথবা আপনি কোনও ফলব্যাক শাখা প্রবেশ করতে পারেন যা বাইরে কাজ করে Graphics2D

সংক্ষেপে, এটি সত্যিই যাওয়ার উপায়। এটি এর চেয়ে একটু সিনট্যাক্টিক্যালি ভারী asInstanceOf, তবে যুক্ত নমনীয়তা প্রায় সর্বদা এটির জন্য উপযুক্ত।


19
+1 কারণ এটি আকর্ষণীয় তবে এই দৃশ্যের জন্য কিছুটা বেশি। তাই না?
ইউজিন ইওকোটা

যদি আমি ইতিমধ্যে প্যাটার্নমেট করেছি তবে জাস্ট মানটির রেফারেন্স হারিয়ে ফেলেছি তবে: <কোড> বেস ম্যাচ My মাইক্রাংক্রিট (মান) => বেস.এস ইনস্ট্যান্সঅফ [মাইক্র্যাক্রিট] .সামান্য (মান)} </code>, পাওয়ার উপায় আছে কি? ' বেস 'মাইক্রোনক্রিটকে কাস্ট করা' এমনকি যদি "কেস মাইক্র্যাংক্রিট (মান)" দ্বারা পরিচালিত 'অ্যাপ্লিকেশন' কলটি শোষণ করে "মান" বের করতে চান?
ithkuil

4
এটি ব্যবহার করে দেখুন: base match { case base @ MyConcrete(value) => base.something(value) } অবশ্যই, ছায়া কাটা optionচ্ছিক base। আপনি ঠিক তত সহজেই একটি ভিন্ন ভেরিয়েবল নাম ব্যবহার করতে পারেন।
ড্যানিয়েল স্পিওক

আমি যা পাই না তা হ'ল আপনি কীভাবে এই প্যাটার্নটির সাথে মেলে একটি ভেরিয়েবলের ফলাফল? জাভাতে যেমন এটি স্ট্রিং এ = (স্ট্রিং) বি; স্কাল সমতুল্য কি হবে?
জেমস ম্যাকমাহন

@ জেমসম্যাকমাহনval gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
কেভিন মেরেডিথ

224
g.asInstanceOf[Graphics2D];

36
একবার আমি স্কালায় অভ্যস্ত হয়ে গেলে, আমি ব্যবহার না করা শিখেছি asInstanceOf, কারণ এটি স্ট্যাটিক টাইপ সিস্টেম থাকার উদ্দেশ্যকে পরাস্ত করে এবং ইয়াকি বোধ করে।
ইউজিন ইয়োকোটা

26
দুর্ভাগ্যক্রমে, সুইং ব্যবহার করার সময় এটি একটি সাধারণ অপারেশন। কাস্টম পেইন্টিং অপারেশনের জন্য, আপনাকে 'পাবলিক শূন্য পেইন্টকম্পোন্ট (গ্রাফিক্স ছ)' পদ্ধতিটি ওভাররাইড করতে হবে। গ্রাফিক্স প্যারামিটারটি আসলে গ্রাফিক্স 2 ডি উদাহরণ, তবে একটি কাস্ট প্রয়োজন। প্যাটার্ন মেলানো সংস্করণটি সম্ভবত ওয়্যারেন্টেডের চেয়ে বেশি ভারবোসিটি। মনে রাখবেন: অদ্ভুতভাবে হাইপারভারবোসিটি এবং প্রলম্বিততা বর্জন করুন!
হোহোনুলি

7
@ হোহোনুলি আমার মনে হয় সেই নির্দিষ্ট ক্ষেত্রে castালাই ঠিক আছে, তবে আপনি যদি scala-swingউপাদানগুলি ব্যবহার করেন তবে
পেইন্টকম্পোনেন্টের

2
এত দিন কেন? কেন "asInstanceOf যখন কেবল" হিসাবে "বা" asof "কীওয়ার্ড বা পদ্ধতি হতে পারে? বা কেন তারা কেবল সি ++ এবং জাভা
উপায়টিকে

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