পরম বলতে কী: _ * স্কালায় মানে?


87

স্কালায় নতুন হওয়ার কারণে (২.৯.১) আমার একটি রয়েছে List[Event]এবং এটি একটিতে অনুলিপি করতে চাই Queue[Event]তবে নীচের সিনট্যাক্সটির Queue[List[Event]]পরিবর্তে এর ফলস্বরূপ :

val eventQueue = Queue(events)

কোন কারণে, নিম্নলিখিত কাজ করে:

val eventQueue = Queue(events : _*)

তবে আমি এটি বুঝতে চাই যে এটি কী করে এবং কেন এটি কাজ করে? আমি ইতিমধ্যে Queue.applyফাংশনের স্বাক্ষরের দিকে তাকিয়েছি :

def apply[A](elems: A*)

এবং আমি বুঝতে পারি কেন প্রথম প্রচেষ্টাটি কাজ করে না, তবে দ্বিতীয়টির অর্থ কী? কী :এবং _*এই ক্ষেত্রে এবং কেন applyফাংশনটি কেবল একটি গ্রহণ করে না Iterable[A]?

উত্তর:


93

a: Aটাইপ অ্যাসক্রিপশন; দেখতে Scala টাইপ ascriptions এর উদ্দেশ্য কী?

: _* টাইপ অ্যাসক্রিপশনের একটি বিশেষ উদাহরণ যা সংকলককে একটি সিকোয়েন্স টাইপের একক যুক্তিকে ভেরিয়েবল আর্গুমেন্ট সিকোয়েন্স, অর্থাৎ ভারার্গস হিসাবে বিবেচনা করতে বলে।

এটি একটি ক্রম বা পুনরাবৃত্তীয় যা একটি একক উপাদান রয়েছে এমন একটি Queueব্যবহার করে তৈরি সম্পূর্ণরূপে বৈধ Queue.apply, সুতরাং আপনি যখন কোনও একক প্রদান করেন ঠিক এটিই ঘটে Iterable[A]


83

এটি একটি বিশেষ স্বরলিপি যা সংকলককে প্রত্যেকটি উপাদানকে একক যুক্তির চেয়ে তার নিজস্ব যুক্তি হিসাবে পাস করতে বলে। এখানে দেখুন ।

এটি এমন একটি প্রকারের টীকা যা একটি অনুক্রমের যুক্তি নির্দেশ করে এবং ভাষা নিয়মের ৪.6.২ বিভাগে "পুনরাবৃত্তি পরামিতি" এর সাধারণ নিয়মে একটি "ব্যতিক্রম" হিসাবে উল্লেখ করা হয়।

এটা যেমন একটি যেমন ফাংশন একটি ফাংশন আর্গুমেন্ট সংখ্যা পরিবর্তনশীল লাগে যখন দরকারী def sum(args: Int*), যা প্রার্থনা করা যেতে পারে sum(1), sum(1,2)ইত্যাদি যেমন আপনি একটি তালিকা থেকে থাকে xs = List(1,2,3), আপনি প্রেরণ করতে পারবেন না xsনিজেই, কারণ এটি একটি হল Listএকটি বদলে Int, তবে আপনি এর উপাদানগুলি ব্যবহার করে পাস করতে পারেন sum(xs: _*)


def sum(xs: _*)থ্রো 'ত্রুটি: আনবাউন্ড ওয়াইল্ডকার্ড প্রকার'
কেমজমানি

আপনার উত্তরটি স্পষ্ট, তবে এটি আসলে আমার জন্য আরও বিভ্রান্তি তৈরি করছে, সাধারণত স্কেলে xs: intমানে এক্স এর ধরণ হ'ল এর উপরের স্ক্যালায় একটি সিনট্যাক্স যেখানে xs: _*এক্স এর নিজস্ব সদস্যদের কাছে খালি করা হয়।
Rpant

উপরের লিঙ্কটি অনুসরণ করে দেখে মনে হচ্ছে এটি কী, টাইপ অ্যাসক্রিপশনটি জাভা টাইপ কাস্টিংয়ের জন্য একটি স্কেল পরিভাষা। ভুল হলে আমাকে সংশোধন করুন।
Rpant

4
@ 7kemZmani: আপনি একটি নির্দিষ্ট Var-args ধরনের সঙ্গে ফাংশন নির্ধারণ করতে হবে: def sum(args: Int*)এবং আপনি ওয়াইল্ডকার্ড "Generic" Var-args ধরনের সঙ্গে সেটিতে কল: val a = sum(xs: _*)। ভাবুন _*যেমন "আমি * কোন int *, অথবা একটি স্ট্রিং *, বা কিছু পদ্ধতি স্বাক্ষর সংজ্ঞায়িত করা হয় ক্ষণস্থায়ী করছি"
আলফনসো Nishikawa

10

পাইথন ভাবেনদের জন্য:

স্কালার _*অপারেটর কম-বেশি পাইথনের * -অপরেটারের সমতুল্য ।


উদাহরণ

লুইজি প্লিংজের সরবরাহিত লিঙ্কটি থেকে স্কেল উদাহরণটি রূপান্তর করা :

def echo(args: String*) = 
    for (arg <- args) println(arg)

val arr = Array("What's", "up", "doc?")
echo(arr: _*)

পাইথনের মতো দেখতে:

def echo(*args):
    for arg in args:
        print "%s" % arg

arr = ["What's", "up", "doc?"]
echo(*arr)

এবং উভয়ই নিম্নলিখিত আউটপুট দেয়:

কি
আপ
ডক?


পার্থক্য: অবস্থানগত পরামিতিগুলি আনপ্যাক করা

যদিও পাইথনের *অপারেটর স্থির-তুরস্কের ফাংশনগুলির জন্য অবস্থানগত পরামিতি / পরামিতিগুলি আনপ্যাকিংয়ের সাথেও মোকাবিলা করতে পারে:

def multiply (x, y):
    return x * y

operands = (2, 4)
multiply(*operands)

8

স্কালার সাথে একই করছেন:

def multiply(x:Int, y:Int) = {
    x * y;
}

val operands = (2, 4)
multiply (operands : _*)

ব্যর্থ হবে:

পদ্ধতিটির গুণনের জন্য পর্যাপ্ত আর্গুমেন্ট নেই: (x: Int, y: Int) Int
অনির্ধারিত মান প্যারামিটার y।

তবে স্কেল দিয়ে এটি অর্জন করা সম্ভব:

def multiply(x:Int, y:Int) = {
    x*y;
}

val operands = (2, 4)
multiply _ tupled operands

লরিন নেলসনের মতে এটি এইভাবে কাজ করে:

প্রথম অংশ, f _, একটি আংশিক প্রয়োগ ফাংশনটির বাক্য গঠন যা কোনও আর্গুমেন্ট নির্দিষ্ট করা হয়নি। এটি ফাংশন অবজেক্টটিকে ধরে রাখতে একটি প্রক্রিয়া হিসাবে কাজ করে। দ্বিখণ্ডিত একটি নতুন ফাংশন প্রদান করে যা আধ্যাত্মিকতা -১ এর একক আরটি-এন টিপল নেয়।

আরও পঠন:

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